virtueller Dstor....geht nicht?????
-
Hallo,
hab grad bisschen mit virtual rumprobiert, und nun geht das hier nciht:class GBase { public: virtual void Drawit()=0; virtual ~GBase(); }; class GFrame:public GBase { public: void Drawit(){cout<<"GFrame"<<endl;} }; class MyFrame:public GFrame { public: void Drawit(){cout<<"MyFrame"<<endl;} }; #pragma argsused int main(int argc, char* argv[]) { GBase* frame = new GFrame; frame->Drawit(); GBase* mframe= new MyFrame; mframe->Drawit(); delete frame; delete mframe; getch(); return 0; }Linker Error...únresolved external GBase::~GBase()....
wieso??
-
Huh?? schrieb:
wieso??
Weil du GBase::~GBase nicht definiert hast.
-
MFK schrieb:
Huh?? schrieb:
wieso??
Weil du GBase::~GBase nicht definiert hast.
und wie muss ich das machen?
der dstor steht doch oben....

-
Huh?? schrieb:
und wie muss ich das machen?
So wie bei jeder anderen Methode auch.
der dstor steht doch oben....

"oben" steht nur eine Deklaration.
-
virtual ~GBase()
{
}
-
Oder:
virtual ~GBase() = 0;Aber dann hast du eine abstrakte Klasse und kannst keine Objekte davon erstellen.
-
FireFlow schrieb:
Oder:
virtual ~GBase() = 0;Aber dann hast du eine abstrakte Klasse und kannst keine Objekte davon erstellen.
Implementieren musst Du ihn trotzdem, typischerweise leer. Sonst knallt's, wenn die abgeleitete Klasse ihren geerbten Destruktor aufruft (und dagegen kann man nix machen).
-
FireFlow schrieb:
Oder:
virtual ~GBase() = 0;Aber dann hast du eine abstrakte Klasse und kannst keine Objekte davon erstellen.
Die hat er sowieso schon, da er DrawIt() pure virtual gemacht hat *anmerk*
@Huh: unterscheide zwischen Deklaration udn Definition einer Methode. Die Methodendeklaration ist das, was in der KLassendefinition steht (normalerweise im header), die Methodendefinition ist das, was in vielen Fällen in der .cpp steht. In deinem Fall hast du allerdings die DrawIt-methode sowohl in GFrame als auch in MyFrame gleich mit definiert. Der Unterschied:
class Foo { //... void myFunc(); //nur Deklaration }; void Foo::myFunc() //Definition immer mit funktionsrumpf { //... } class Bar { //... void notYourFunc() //Deklaration mit Definition, da Funktionsrumpf folgt { //... }; };
-
aha, ich werds mal ausprobiern...
in dem tutorial war der eben einfach so drin, ohne definition....=/