2013-05-09 133 views
0

差不多解決了與我的代碼在stackoverflow用戶的幫助下的問題,但現在有不同的問題。我的代碼現在看起來像這樣:正向聲明'struct bb',類

#include <iostream> 
#include <cmath> 
#include <sstream> 
using namespace std; 

class root 
{ 
public: 
    virtual ~root() {} 

    virtual root* addA(const root& a) const=0; 
    virtual root* addB(const root& b) const=0; 
}; 

class bb; 

class aa: public root 
{ 
public: 
    aa() { } 
    aa(const aa& a) { } 

    root* addA(const root& a) const 
    { 
     return new aa(); 
    } 

    root* addB(const root& b) const 
    { 
     return new bb(); 
    } 
}; 

class bb: public root 
{ 
public: 
    bb() { } 
    bb(const bb& b) { } 

    root* addA(const root& a) const 
    { 
     return new aa(); 
    } 

    root* addB(const root& b) const 
    { 
     return new bb(); 
    } 
}; 

int main(int argc, char **argv) 
{ 
} 

但是,當我編譯它,它給了錯誤:

/home/brain/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root* aa::addB(const root&) const’:| 
/home/brain/Desktop/Temp/Untitled2.cpp|30|error: invalid use of incomplete type ‘struct bb’| 
/home/brain/Desktop/Temp/Untitled2.cpp|15|error: forward declaration of ‘struct bb’| 
||=== Build finished: 2 errors, 0 warnings ===| 
+0

@Mat我認爲依賴問題可以通過將相關方法的定義放在實現文件中來解決。雖然設計仍然很腥。 – juanchopanza 2013-05-09 09:26:42

回答

4

對於這個特定的情況下,你可以移動的成員函數的定義,下課bb有已被定義。或者優選地將它們放在單獨的.cpp文件和include的頭部。

class aa: public root 
{ 
public: 
    // .... 
    root* addB(const root& b) const; 
    // Declaration only 
}; 


class bb: public root 
{ 
public: 
    // .... 
}; 

// Here. 
inline // <--- If you define it in the header. 
root* aa::addB(const root& b) const 
{ 
    return new bb(); 
} 
2

由於編譯器沒有關於bb類中的任何想法,因此將無法創建一個對象,並返回其return bb()

,如果你定義root* addB(const root& b) const類的外部,因爲它會成功時間它將能夠知道類bb的大小。

+0

請回答下面的鏈接,詢問類似的問題.. http://stackoverflow.com/q/16398416/2168706 – 2013-05-10 04:32:20