2013-05-10 26 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