2011-01-08 122 views
0

有人可以請解釋爲什麼我不能編譯這段代碼?我知道這個設計非常糟糕,但我只想知道爲什麼我不能編譯它,先謝謝 P.S.遺憾的格式,不能在面板上找到反引號在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); 
     } 
}; 

我有錯誤的IntClass在addDouble方法:

invalid use of undefined type struct DoubleClass 

編輯 IntClass不是嵌套類NumberClass

+0

你不能打擾包括錯誤? – 2011-01-08 22:16:09

+0

編譯器報告什麼錯誤?在哪一行? – 2011-01-08 22:16:17

+0

修復了格式化;您可以選擇代碼並使用Markdown編輯器工具欄上的「{}」按鈕進行格式化,也可以按Ctrl + K或在每行前加上四個空格。 – 2011-01-08 22:16:58

回答

2

IntClass::addDouble的內部,您使用類DoubleClass,但此時DoubleClass只有一個前向聲明,因此您不能調用它的方法。

這可以通過將IntClass::addDouble的主體放在class DoubleClass的完整聲明之後,或者將代碼分離爲標題和實現文件來解決。

0

如果您在基類中有pure virtual function,那麼派生類必須實現它。

0

如果所有派生歸入您必須實現的純虛函數(其中在最後一組= 0),如addDouble,addInt,數&運營商+(數& x)= 0,print_number

否則你將有錯誤派生歸入

寫IntClass和DoubleClass

0

重構代碼,純虛函數的實現,所以每個類聲明的進入了自己的頭文件,Number.h,IntClass.h DoubleClass.h和這些實現將進入編譯單元I. ntClass.cpp和DoubleClass.cpp。

然後得到IntClass.cpp到#include DoubleClass.h因爲它使用了那個類。

然後它會編譯。

但是,這段代碼會非常嚴重地泄漏,並且完全不是const常量。這些問題也需要解決。也許返回智能指針而不是引用,或者返回一個外部的「持有者」類,它正確地管理指針下方的指針的生命週期。

而你爲什麼要重寫數字系統?

0

你有知名度的問題,因爲IntClass是一個嵌套類的NumberDoubleClass代替普通班,但它的聲明之前使用(所以字DoubleClass在第8行,並不意味着編譯器的任何東西)。

一個解決方案可以在開始時添加兩個向前,然後通過在定義IntClass之前添加一個右大括號來使所有三個類爲普通頂級類。

class IntClass; 
class DoubleClass; 

但是會有的直列實施IntClass::addDouble一個問題,因爲在這一點上DoubleClass只知道是一個類(這是一個不完整的類型)。通過分離實現並在DoubleClass的定義之後移動它,可以編譯。

請注意,現在編譯的這段代碼仍然非常糟糕(特別是泄漏)。