我有点问题。我有一个A类实例化B的对象,然后B实例化A的对象。这有可能吗?我尝试在每个
的标题中添加它#ifndef A
#define A
class a...
#endif
但是如果让我进入一个无限的头部循环,它到达最大的头部包含,那么显然一个人正在调用另一个而另一个正在调用那个。有没有办法实现这个目标?
编辑:好的,这似乎是一个很好的答案,但现在A抱怨B没有构造函数,尽管它确实有一个构造函数。我无法想出那个。
答案 0 :(得分:9)
您可以转发声明类,例如:
A.h
:
class B;
class A
{
B* a_;
};
B.h
:
class A;
class B
{
A* a_;
};
在您实际使用类的源文件中(即创建它们,销毁它们,使用它们的成员等),您需要包含两个标题以便它们的定义可用:
#include "A.h"
#include "B.h"
答案 1 :(得分:4)
你应该打破这种循环依赖。例如,您可以使用指向B的指针,然后您可以转发声明B类。
答案 2 :(得分:2)
您是否尝试使用前向声明?
class B;
class A
{
private:
B* instanceOfB_;
};
答案 3 :(得分:2)
这不是一个好的设计。但是,为了能够使用前向声明。
在classA.h文件中删除classB.h中的所有包含并将它们移动到classA.cpp。然后在声明classA之前写入行class B;
以转发声明类B.这样你就可以在类A中拥有B *(但不是B)的成员变量。对于classB接下来做同样的事。
答案 4 :(得分:2)
答案 5 :(得分:1)
如果您的意思是class A {B b;};
和class B {A a;}
,请不要。类数据成员包含在类中,因此你有一个包含A的B,其中包含一个包含A的B ....记住,在C ++中,数据对象不是对某事物的引用,而是实际的的事情。
您需要class A {B * b;};
和class B {A * a;}
之类的内容,您需要提供指针。在定义之前,您需要class A; class B;
之类的东西告诉编译器A
和B
是类。这些被称为“前瞻性声明”。