2009-08-19 9 views
7

Donc, j'ai une classe abstraite Panel et une implémentation MyPanel. Ils ressemblent à ceci:Non résolu externe (constructeur de classe abstraite/destructeur)

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 
} 

Je reçois des erreurs de l'éditeur de liens pour le constructeur/destructor de 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 

Pourquoi ai-je cette erreur de liens?


--- LA RÉPONSE ---

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

Je pensais que je l'avais essayé avant le déjeuner. Il se avère que j'avais tort.

+0

Il semble que vous ayez quelques fautes de frappe. Pouvez-vous clarifier? Les déclarations de classe doivent se terminer par a; par exemple, la classe XXX {}; Vous avez également ce qui ressemble à un constructeur virtuel mais cela n'est pas valide en C++ – maccullt

+0

Correction de mes fautes de frappe et ajout de la bonne solution. –

+0

Dans votre "réponse" vous devez indiquer explicitement ce que vous avez changé (fournir des implémentations vides via {}). Dans le cas contraire, il s'agit d'un exercice pour le lecteur de comparer vos échantillons de code et comprendre ce qui est différent. – User

Répondre

6
  1. il n'existe pas de constructeur virtuel.
  2. Vous devez toujours fournir l'implémentation du destructeur.
3

Les destructeurs purement virtuels doivent encore être implémentés.

Pour en dire un peu:

Le destructor d'une classe sera toujours appelée si une instance d'une sous-classe se destructed, donc il a besoin d'avoir une mise en œuvre. (Fondamentalement, le seul effet de rendre un destructeur purement virtuel est qu'il empêche l'instanation de la classe). Comme pour le constructeur: Vous le rendez purement virtuel (ce que je ne vois pas pourquoi), mais vous l'appelez explicitement du constructeur de la sous-classe.

+2

Les constructeurs ne peuvent pas être virtuels en C++. – maccullt