2009-08-19 4 views
7

Also, ich habe eine abstrakte Klasse Panel und eine Implementierung davon MyPanel. Sie sehen wie folgt aus:Ungelöste Externe (abstrakte Klasse Konstruktor/destructor)

class Panel : public QWidget 
{ 
public: 
    Panel(QWidget* parent = 0) = 0; 
    virtual ~Panel() = 0; 
    // but wait, there's more!! 
}; 

class MyPanel : public Panel 
{ 
public: 
    MyPanel(QWidget* parent = 0); 
    ~MyPanel() {}; // nothing to do here 
}; 

MyPanel::MyPanel(QWidget* parent) : 
    Panel(parent) 
{ 
    // you must construct additional pylons 
} 

Ich erhalte Linkerfehler für den Konstruktor/Destruktor von VC++

error LNK2019: unresolved external symbol "public: virtual __thiscall Panel::~Panel(void)" ([email protected]@[email protected]) referenced in function "public: virtual __thiscall MyPanel::~MyPanel(void)" ([email protected]@[email protected]) mypanel.obj 
error LNK2019: unresolved external symbol "public: __thiscall Panel::Panel(class QWidget *)" ([email protected]@[email protected]@@@Z) referenced in function "public: __thiscall MyPanel::MyPanel(class QWidget *)" ([email protected]@[email protected]@@@Z) mypanel.obj 

Warum bin ich diesen Linkerfehler zu bekommen?


--- DIE ANTWORT ---

class Panel : public QWidget 
{ 
public: 
    Panel(QWidget* parent = 0) : QWidget(parent) {}; 
    virtual ~Panel() {}; 
    // but wait, there's more!! 
}; 

Ich dachte, ich dies vor dem Mittagessen versucht hatte. Stellt sich heraus, ich habe mich geirrt.

+0

Es sieht aus wie Sie einige Fehler haben. Könntest Du das erläutern? Klassendeklarationen müssen mit einem beenden; z.B. Klasse XXX {}; Auch Sie haben, was aussieht wie ein virtueller Konstruktor, aber das ist nicht gültig in C++ – maccullt

+0

Korrigiert meine Tippfehler und fügte korrekte Lösung hinzu. –

+0

In Ihrer "Antwort" sollten Sie explizit darauf hinweisen, was Sie geändert haben (im Prinzip leere Implementierungen über {}). Ansonsten ist es eine Übung für den Leser, Ihre Code-Beispiele zu vergleichen und zu verstehen, was anders ist. – User

Antwort

6
  1. gibt es keine solche Sache wie virtueller Konstruktor.
  2. Sie sollten immer noch die Umsetzung von destructor bieten.
3

Rein virtuelle Destruktoren müssen noch eine Implementierung haben.

erweitern auf, dass ein bisschen:

Der Destruktor einer Klasse wird immer, wenn eine Instanz einer Unterklasse wird zerstört genannt werden, so dass es eine Implementierung haben muss. (Im Grunde die einzige Wirkung, dass ein destructor rein virtuell ist, dass es instanatiation die Klasse verhindert).

Wie für den Konstruktor: Sie machen es rein virtuell (was ich keinen Grund sehe zu tun), aber dann rufen Sie es explizit aus dem Konstruktor der Unterklasse.

+2

Konstruktoren können in C++ nicht virtuell sein. – maccullt