A.h文件
class A
{
public:void methodA();
...
};
B.h文件
class B
{
public:void methodB();
...
}
现在是再类A中要调用类B中的方法,类B中有要调用类A中的方法!
试验过的失败方法:
方法1:
A.h文件
#include "B.h"
class B;
class A
{
private:B m_classB;
public:void methodA();
...
};
B.h文件:
#include"A.h"
class B
{
private:A m_classA;
public:void methodB();
...
};
导致死循环。
可能原因:构造A时,需要先构造B;而构造B时又需要先构造A,导致死循环;
方法2:
A.h文件
#include "B.h"
class B;
class A
{
private:B *m_pClassB;
public:void methodA();
...
};
B.h文件:
#include"A.h"
class B
{
private:A *m_pClassA;
public:void methodB();
...
};
然后分别在A.cpp中的类A构造函数中加上:m_pClassB = new class B;
在B.cpp中的类B构造函数中加上:m_pClassA = new Class A;
可能原因:同方法1。
方法3:
A.h文件
#include "B.h"
class B;
class A
{
friend class B;
private:B *m_pClassB;
public:void methodA();
...
};
B.h文件:
#include"A.h"
class B
{
private:A *m_pClassA;
public:void methodB();
...
};
然后分别在A.cpp中的类A构造函数中加上:m_pClassB = new class B;
在B.cpp中的类B构造函数中加上:m_pClassA = new Class A;
出现的结果和原因同上。
正确的方法:
A.h文件
#include "B.h"
class B;
class A
{
friend class B;
private:B *m_pClassB;
public:void methodA();
...
};
B.h文件:
#include"A.h"
class B
{
public:A *m_pClassA;
public:void methodB();
...
};
然后分别在A.cpp中的类A构造函数中加上:m_pClassB = new class B;m_pClassB->m_pClassA = this;
在B.cpp中的类B构造函数中加上:m_pClassA = new Class A;
本文探讨了两个相互依赖的类A和B如何正确地互相引用对方而不导致编译死循环的问题。通过对比三种不同的实现方式,指出了直接在类声明中包含对方头文件的方式会导致无限递归,并提供了一种有效解决方案:利用前向声明并在构造函数中设置相互引用。
1165

被折叠的 条评论
为什么被折叠?



