2013-10-13 51 views
0

有兩類這樣的:關於提前聲明的C++類

class B; 

class A { 
public: 
    int a, b; 
    B *b; 
public: 
    int getctxt() 
    { 
    b->getctxt1(); 
    } 
} 

Class B { 
public: 
    int c,d; 
    A *a; 
    getctxt1() 
    { 
     /* something */ 
    } 
} 

main() 
{ 
    B *b = new B(); 
    A *a = new A(); 
    b->a = a; 
    a->b = b; 
} 

但是,當我嘗試編譯,它說

無效使用不完全型「結構A」的。

誰能告訴我如何解決這個問題?

+3

不應該在每個類聲明結尾都有分號';'? ;-) – Jost

+0

請參閱這裏:http://stackoverflow.com/questions/19343279/circular-dependecies-in-c-classes-that-dpend-each-other – littleadv

+0

不完整的類型'結構A'的無效使用你的代碼。不過,還有很多其他錯誤。請發佈與問題描述相關的代碼(或與代碼相匹配的問題描述)。 – Oswald

回答

2

內聯類成員函數定義被解析,就好像它們出現在類定義之後一樣。當然B在這一點上沒有定義。因此,移動成員函數定義A::getctxt出來A類的定義:

class B; 

class A { int getctxt(); /* ... */ }; 

class B { /* ... */ }; 

int A::getctxt() 
{ 
    b->getctxt1(); // at this point, *b has complete type! 
    return -35; 
} 
+0

我做到了。直到我得到相同的錯誤:(..我移動了getctxt()的外部定義A. – user1667630

+0

@ user1667630:你移動它*過去* B的定義? –

0

這就是爲什麼我們建議您把班.h文件和.cpp文件分開的原因。當你編寫class B;時,你告訴編譯器有一個叫做B的類,但就是這樣,編譯器不知道這個類裏面有什麼。當編譯器到達b->getctxt1();行時,它知道bB的一個實例,但它不知道getctxt1()是否爲B的一種方法,因爲它在下面。如果您將所有文件都寫入單個文件中,則應首先編寫所有聲明,然後再編寫所有實現。

0

沒有人注意到Class B語法錯誤?小寫class是正確的。 和A中的那兩個公共成員int bB *b

一旦你刪除這些並完成類定義使用分號,加void類型到缺少它B.

僅僅定義爲它們應該被定義的功能void getctxt1()。不是沒有內聯的理由,你知道哪個是!