Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

12.11.2008, 19:14

Problem mit abstrakter Klasse

Hallo,

ich frage mich, warum der Linker bei dem folgenden Code meckert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Renderer
{
public:
    Renderer();
    virtual ~Renderer(void);

private:
    Surface* m_pSurface;

protected:
    virtual Surface* getSurface () const = 0;
};

Renderer::Renderer () : m_pSurface (getSurface ()) { }



class DX9Renderer : public Renderer
{
public:
    DX9Renderer();
    virtual ~DX9Renderer(void);

protected:
    Surface* getSurface () const;
};

Surface* DX9Renderer::getSurface () const
{
    return new DX9Surface ();
}

Quellcode

1
Fehler  1   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""protected: virtual class Surface * __thiscall Renderer::getSurface(void)const " (?getSurface@Renderer@@MBEPAVSurface@@XZ)" in Funktion ""public: __thiscall Renderer::Renderer(void)" (??0Renderer@@QAE@XZ)".   Renderer.obj


Ist eine solche Strukturierung in C++ nicht möglich? Ich "komme" aus der Java-Welt und da geht das :)

Vielen Dank im Voraus!
<< an dieser Stelle ist eine Signatur verstorben >>

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

12.11.2008, 19:52

In dem Moment in dem im Konstruktor von Renderer getSurface() aufgerufen wird ist DX9Renderer noch gar nicht erzeugt worden, damit ist auch der vtable noch leer, in dem Fall kann es also gar nicht gehen. Ich nehme aber auch mal an, dass es nicht funktioniert wenn es in einer anderen Methode als dem Konstruktor stehen würde.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

12.11.2008, 20:25

Niemals nimmer eine virtuelle Funktion im Konstruktor aufrufen! Nein, niemals!
@D13_Dreinig

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

4

12.11.2008, 20:44

Es macht wirklich nicht so viel Sinn getSurface() aufzurufen bevor überhaupt einmal eine Surface festgelegt wurde. Selbst wenn der Compiler/Linker das zulassen würde, das Ergebnis wäre vollkommen undefiniert.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

12.11.2008, 21:58

Zitat von »"David_pb"«

Niemals nimmer eine virtuelle Funktion im Konstruktor aufrufen! Nein, niemals!


Wieso nicht? Der Compiler erstellt dann doch einfach einen Aufruf zur "eigenen" Funktion. also wenn beispielsweise die klasse A eine methode virtual foo(); hat und B von A abgeleitet ist. Dann kann A doch im konstruktor foo aufrufen. Es wird dann halt A::foo anstatt B::foo aufgerufen, eventuell ist das ja sogar gewollt. Im konstruktor von B kann man ja dann B::foo aufrufen (oder nicht?)... natürlich nur wenn man das gebrauchen kann, ist wohl eher zufall, wenn einem dieses verhalten nützlich ist^^

Nur wenn die funktion pure virtual ist sollte es doch probleme geben oder hab ich mal wieder ne wissenslücke?

Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

12.11.2008, 23:02

Schau dir dazu mal Item 9 von Meyers an.
@D13_Dreinig

Werbeanzeige