2009-08-19 16 views
7

私は抽象クラスPanelとその実装MyPanelを持っています。彼らは、次のようになり:未解決の外部(抽象クラ​​スのコンストラクタ/デストラクタ)

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 
} 

私は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 

は、なぜ私はこのリンカエラーを取得していますから、コンストラクタ/デストラクタのためのリンカエラーを取得していますか?


--- --- ANSWER

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

私は昼食前にこれを試したと思いました。私は間違っていたことが分かります。

+0

いくつかのタイプミスがあるようです。明確にすることはできますか? クラス宣言は、aで終わる必要があります。例えば、クラスXXX {}; また、仮想コンストラクタのように見えますが、C++では無効です – maccullt

+0

私のタイプミスを修正し、正しい解決策を追加しました。 –

+0

あなたの "答え"には、変更したものを明示する必要があります(基本的に空の実装を{}で提供する)。それ以外の場合は、コードサンプルを比較して何が違うのかを理解するための練習として残しておきます。 – User

答えて

6
  1. 仮想コンストラクタのようなものはありません。
  2. まだデストラクタの実装を提供する必要があります。
3

純粋な仮想デストラクタはまだ実装が必要です。

は少しことで展開するには:

クラスのデストラクタは、常に呼び出されますサブクラスのインスタンスが破壊得れば、それは実装を持っている必要がありますので。 (基本的に、デストラクタを純粋に仮想的にする唯一の効果は、クラスのインスタンス化を防ぐことです)。

コンストラクタに関して:あなたはそれを純粋にバーチャルにしていますが(これは私には何の理由もありません)、サブクラスのコンストラクタから明示的に呼び出すことができます。

+2

コンストラクタをC++で仮想化することはできません。 – maccullt