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.
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
Poprawiono moje literówki i dodano poprawne rozwiązanie. –
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