2013-05-10 55 views
0

我想從類A調用Foo()函數,通過另一個類的指針 (我不能包含其他類的頭文件,因爲我在另一個類中執行該函數,所以這將導致一個,,包含本身'錯誤)我該怎麼做?類互相調用函數(包括異常)

//a.h 


class X; // here I can't include "x.h", so forward declaration, but that results incomplete type 

class A 
{ 
X* ptr; 

void Example() 
{ 
    X->Foo(); // it can't be use, casue ,,incomplete type is not allowed'' 
} 


void Print(); 
} 

//x.h 
#include "a.h" 

class X 
{ 
A* ptrarray[]; 

void Foo(); 

void List() 
{ 
    for (i...) 
    ptrarray[i]->Print(); // ok, works fine 
} 
} 

我怎樣才能解決這個問題搞定了,你能給我什麼建議?

+0

使用標頭警衛:http://en.wikipedia.org/wiki/Include_guard – TheDarkKnight 2013-05-10 11:00:44

+0

我試過了,但沒有工作......或者請在這個例子中向我展示正確的用法。謝謝 – user2369698 2013-05-10 11:02:07

+0

將你的文件分割成.h和.cpp文件,然後把這個實現放到cpp文件中。這樣,你只需要轉發聲明類而不在.h文件中包含頭文件。 – TheDarkKnight 2013-05-10 11:06:21

回答

0

在另一個文件中定義Foo()和void List()。並將X和A作爲第一個參數傳遞給它們。 當你定義它們的時候,你不會得到這個不完整類型的錯誤,因爲編譯器會提前定義它們的定義。 所以THRID文件看起來像

// wrapper.h 
include <a.h> 
include <x.h> 

void Foo(X *objX, ....); 
void List(A *objA, ....); 

//wrapper.cpp 
void Foo(X *objX, ....) 
{ 
    objX->Foo(....); 
} 

void List(A *objA, ....) 
{ 
    objA->List()l 
} 
+0

感謝您的回答。 葉,我想過這個解決方案,但在我的項目中,非常重要的是,命名函數(Foo,List等)成爲這些類的一部分(因爲封裝和其他OO原理) – user2369698 2013-05-10 11:05:03

0

什麼錯誤,你正在做的是你定義在.h文件本身類的成員函數。 因此,請在corrosponding a.cpp和x.cpp的類聲明之外聲明它們。並在a.cpp和x.cpp中添加a.h和x.h。那麼如果你想讓他們內聯,你可以添加內聯給他們,同時定義類聲明外

+0

在我的項目中定義在.cpp文件中,以及.h文件中的聲明(在本例中,我只將定義寫入類聲明中,因爲爲了簡單起見,爲了說明funcs的用途以及它們的用途) – user2369698 2013-05-10 11:13:45