2009-08-19 12 views
7

Quindi, ho una classe astratta Panel e un'implementazione di esso MyPanel. Hanno un aspetto simile a questo:Esterno non risolto (costruttore/distruttore di classe astratta)

errori del linker
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 
} 

che sto ricevendo per il costruttore/distruttore da 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 

Perché mi appare questo errore linker?


--- --- LA RISPOSTA

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

Ho pensato che avevo provato questo prima di pranzo. Ho scoperto che mi ero sbagliato.

+0

Sembra che tu abbia alcuni refusi. Puoi chiarire? Le dichiarazioni di classe devono terminare con a; ad es., classe XXX {}; Anche tu hai quello che sembra un costruttore virtuale ma che non è valido in C++ – maccullt

+0

corretto i miei errori di battitura e ho aggiunto la soluzione corretta. –

+0

Nella tua "risposta" devi indicare esplicitamente cosa hai cambiato (in pratica fornisci implementazioni vuote tramite {}). Altrimenti è lasciato al lettore il compito di confrontare i campioni del codice e capire cosa è diverso. – User

risposta

6
  1. non esiste un costruttore virtuale.
  2. È ancora necessario fornire l'implementazione del distruttore.
3

I distruttori puramente virtuali devono ancora implementare.

Per espandere su questo un po ':

sarà sempre chiamato Il distruttore di una classe se qualsiasi istanza di una sottoclasse viene distrutto, quindi ha bisogno di avere un'implementazione. (Fondamentalmente l'unico effetto di rendere un distruttore puramente virtuale è che impedisce l'instanatiazione della classe).

Per quanto riguarda il costruttore: lo stai rendendo puramente virtuale (che non vedo alcun motivo per farlo), ma poi lo chiami esplicitamente dal costruttore della sottoclasse.

+2

I costruttori non possono essere virtuali in C++. – maccullt

Problemi correlati