2010-12-06 31 views
5

クラスの設定があり、そのクラスから継承を使用しています。C++未解決の外部シンボル

#include "a.h" 
#include <iostream> 
class b: public a 
{ 
public: 
    void print(); 
}; 

そして、私はこれらのファイルの両方を含めていますメインファイルでb.cpp

#include "a.h" 
#include "b.h" 
void b::print(){}; 

中:ファイルBHでファイルああ

class a 
{ 
public: 
    virtual void print(); 
}; 

#include "a.h" 
#include "b.h" 

ただし、仮想関数printの未解決のシンボルが表示されます。ファイルa.objがエラーを生成するファイルとしてリストされています。何が間違っていますか? b.cppをクラス定義の下のb.hに移動すると、うまく動作します。

答えて

9

b :: printの実装はありますが、:: printの実装はありません。クラスaのオブジェクトをインスタンス化し、print()を呼び出すとどうなりますか?すなわち、

a o; 
o.print(); 

b :: printは:: printをオーバーライドしますが、依然として:: printの実装が必要です(純粋な仮想にしない限り)。

で仮想プリントは純粋にするために、このようにそれを定義します。

virtual void print() = 0; 

クラスは純粋仮想関数を持っている場合、あなたはそのクラスのオブジェクトをインスタンス化することはできません。実際にインスタンス化できるクラスを作成する前に、そのクラスから派生し、純粋な仮想関数の実装を提供する必要があります。

+0

私の推測の終わりにセミコロンが必要だと思います。 –

+0

純粋な仮想の意味は何ですか? –

+0

ああ私はそれを得た。私は仮想宣言の最後に= 0を加えなければならなかった。将来の視聴者のためのhttp://en.wikipedia.org/wiki/Virtual_function#C.2B.2B_2ありがとうございました。 –

1

これはタイプミスかもしれませんが、b.cppでは、bクラスではなくAddというクラス内でprint()関数を実装しました。

+0

注目していただきありがとうございます、それはタイプミスでした。 (入力ミス、実際の問題はまだ同じです) –

+0

ok - 私は@ Ferruccioの答えが次に行く方法かもしれないと思います –

0

私はOPが実際に確認するために十分な情報を提供しなかったにもかかわらず、これはそれをであるあなたがクラスインターフェイス

関連する問題