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