2011-01-08 12 views
0

誰かがなぜコードのこのスニペットをコンパイルできないのですか?私はこのデザインが非常に悪いことを知っていますが、なぜ私はそれをコンパイルできないのか知りたいのですが、事前に感謝します。 P.S.フォーマットのため申し訳ありませんが、私はaddDouble方法でIntClassでエラーが発生しているパネルC++のコンパイルエラー

//Deriving classes definition 
class IntClass; class DoubleClass; 

//The Virtual Number Class. IntClass and FloatClass will derive from this class. 

class Number { 
    public: 
     //return a Number object that's the results of x+this, when x is DoubleClass 
     virtual Number& addDouble(DoubleClass& x) = 0; 

     //return a Number object that's the results of x+this, when x is IntClass 
     virtual Number& addInt(IntClass& x) = 0; 

     //return a Number object that's the results of x+this, when x is either 
     //IntClass or DoubleClass 
     virtual Number& operator+(Number& x) = 0; 
}; 

class IntClass : public Number { 
    private: 
     int my_number; 
    public: 
     //Constructor 
     IntClass(int n):my_number(n) {} 

     //returns the number stored in the object 
     int get_number() {return my_number;} 

     //return a DoubleClass object that's the result of x+this 
     Number& addDouble(DoubleClass& x){ 
     return x.addInt(*this); 
     } 

     //return an IntClass object that's the result of x+this 
     Number& addInt(IntClass& x){ 
     IntClass* var = new IntClass(my_number + x.get_number()); 
     return *var; 
     } 

     //return a Number object that's the result of x+this. 
     //The actual class of the returned object depends on x. 
     //If x is IntClass, then the result if IntClass. 
     //If x is DoubleClass, then the results is DoubleClass. 
     Number& operator+(Number& x){ 
     return x.addInt(*this); 
     } 
}; 

class DoubleClass : public Number { 
    private: 
     double my_number; 
    public: 
     //Constructor 
     DoubleClass(double n):my_number(n) {} 

     //returns the number stored in the object 
     double get_number() {return my_number;} 

     //return a DoubleClass object that's the result of x+this 
     Number& addDouble(DoubleClass& x){ 
     DoubleClass* var = new DoubleClass(my_number + x.get_number()); 
     return *var; 
     } 

     //return a DoubleClass object that's the result of x+this 
     Number& addInt(IntClass& x){ 
     DoubleClass* var = new DoubleClass(my_number + x.get_number()); 
     return *var; 
     } 

     //return a DoubleClass object that's the result of x+this. 
     //This should work if x is either IntClass or DoubleClass 
     Number& operator+(Number& x){ 
     return x.addDouble(*this); 
     } 
}; 

にバッククォートを見つけることができません。

invalid use of undefined type struct DoubleClass 

編集 IntClassはNumberClassの入れ子になったクラス

ではありません
+0

あなたはエラーを含めるのに気にすることはできませんか? –

+0

コンパイラはどのようなエラーを報告しますか?どの行? –

+0

フォーマットが修正されました。コードブロックを選択し、マークダウンエディタのツールバーの '{}'ボタンを使うか、 'Ctrl + K 'を押すか、各行の先頭に4つのスペースを入れるようにフォーマットします。 –

答えて

2

IntClass::addDoubleの中には、クラスDoubleClassを使用しますが、その時点でDoubleClassには前方宣言しかないため、メソッドを呼び出すことはできません。

これは、完全宣言class DoubleClassの後にIntClass::addDoubleの本文を置くか、コードをヘッダーファイルと実装ファイルに分けることで修正できます。

0

pure virtual functionが基本クラスにある場合は、派生クラスがそれを実装する必要があります。

+1

うわー!編集した後、私は数値クラス 'virtual printNumber()= 0;'にない純粋な仮想関数があることを知ります。 – Mahesh

0

場合は、すべての派生あなたが純粋仮想関数を実装する必要があります分類(ここで、最後にセット= 0)などaddDouble、いるAddInt、数&演算子+(ナンバー& X)= 0として、print_number他にあなたを

はIntClassとDoubleClass

0

リファクタリングコードに純粋仮想関数の実装書き込み分類導出のエラーを持っているので、各クラス宣言は、それ自身のヘッダファイル、Number.h、IntClass.h DoubleClass.hとになります実装はコンパイル単位Iに入りますntClass.cppとDoubleClass.cpp。

次に、そのクラスを使用するため、#include DoubleClass.hにIntClass.cppを取得します。

これでコンパイルされます。

しかし、このコードはひどくリークすることがあり、完全に非const正しいです。これらの問題にも対処する必要があります。おそらく、参照の代わりにスマートポインタを返すか、適切にポインタの寿命を適切に管理する外部の "ホルダー"クラスを返します。

なぜ数値システムを書き換えているのですか?

+0

私はこのコードを使用しません、なぜ私はそれをコンパイルできないのか知りたいだけです。 – rookie

+1

真実かどうか、これは答えではありません。 –

+0

しかし、コードのリファクタリングの一部として、実際にはすべてのクラスを1つのファイルに入れることはできず、IntClass.cppはDoubleClass.hを#includeしてコンパイルします。 – CashCow

0

IntClassNumberDoubleClassのネストされたクラスではなく、通常のクラスですが、それは(その8行目のワードDoubleClassは、コンパイラのために何を意味するものではありません)、その宣言の前に使われているので、あなたは、視認性の問題を抱えています。

解決策は、最初に2つのフォワードを追加してから、IntClassの定義の前に中かっこを追加することで、3つのクラスすべてを通常のトップレベルクラスにすることができます。その時点DoubleClassでのみ(それは不完全型'S)クラスであることが知られているので

class IntClass; 
class DoubleClass; 

しかしIntClass::addDoubleのインライン実装に問題が存在することになります。実装を分離し、DoubleClassの定義の後に移動することにより、コンパイルすることができます。

現在コンパイルされているこのコードは、まだ非常に悪い(特に漏れている)ことに注意してください。

関連する問題