2009-08-19 16 views
7

Mam więc abstrakcyjną klasę Panel i jej implementację MyPanel. Wyglądają podobnie do tego:Nierozwiązany zewnętrzny (konstruktor klasy abstrakcyjnej/destruktor)

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 
} 

Dostaję błędy linkera dla konstruktora/destruktora z 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 

Dlaczego otrzymuję ten błąd linkera?


--- ODPOWIEDŹ ---

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

myślałem, że próbowałem to przed obiadem. Okazuje się, że się myliłem.

+0

Wygląda na to, że masz kilka literówek. Możesz wyjaśnić? Deklaracje klas muszą kończyć się znakiem a; np. klasa XXX {}; Masz również coś, co wygląda jak wirtualny konstruktor, ale to nie jest poprawne w C++ – maccullt

+0

Poprawiono moje literówki i dodano poprawne rozwiązanie. –

+0

W swojej "odpowiedzi" powinieneś wyraźnie wskazać, co zmieniłeś (zasadniczo zapewniają puste implementacje przez {}). W przeciwnym razie jest to ćwiczenie dla czytelnika, aby porównać próbki kodu i zrozumieć, co jest inne. – User

Odpowiedz

6
  1. Nie ma czegoś takiego jak wirtualny konstruktor.
  2. Nadal powinieneś zapewnić implementację destruktora.
3

Czysto wirtualne destruktory wciąż wymagają implementacji.

Aby rozwinąć na tym kawałku:

Destruktor klasy zawsze będą nazywane ewentualne wystąpienie podklasy zostanie zniszczona, więc musi posiadać implementację. (Zasadniczo jedynym skutkiem, który sprawia, że ​​destruktor jest całkowicie wirtualny, jest to, że uniemożliwia instanatiację klasy).

Co do konstruktora: Robisz to czysto wirtualnie (czego nie widzę żadnego powodu), ale potem jawnie wywołujesz go z konstruktora podklasy.

+2

Konstruktory nie mogą być wirtualne w C++. – maccullt

Powiązane problemy