3

我对此有点问题。我有一个类 A 实例化 B 的对象,然后 B 实例化 A 的对象。这有可能吗?我尝试在每个标题中添加这个

#ifndef A
#define A
  class a...
#endif

但是如果让我处于一个无限的标题循环中,它会达到最大标题包含,所以很明显一个正在调用另一个,另一个正在调用那个。有什么办法可以做到这一点?

编辑:好吧,这似乎是一个很好的答案,但现在 A 抱怨说 B 没有构造函数,尽管它确实有一个构造函数。我想不通那个。

4

6 回答 6

9

您可以转发声明类,例如:

A.h

class B;

class A
{
    B* a_;
};

B.h

class A;

class B
{
    A* a_;
};

在您实际使用类的源文件中(即创建、销毁它们、使用它们的成员等),您需要包含两个标头,以便它们的定义可用:

#include "A.h"
#include "B.h"
于 2010-01-28T16:19:20.737 回答
4

你应该打破这种循环依赖。例如,您可以使用指向 B 的指针,然后您可以转发声明 B 类。

于 2010-01-28T16:20:29.003 回答
2

您是否尝试过使用前向声明?

class B;

class A
{
  private:
     B* instanceOfB_;

};
于 2010-01-28T16:20:14.343 回答
2

这不是一个好的设计。但是,为了使它成为可能,只需使用前向声明。

在 classA.h 文件中删除任何包含到 classB.h 并将它们移动到 classA.cpp。然后在声明 classA 之前写一行class B;来转发声明 class B。这样你就可以在 class A 中拥有 B*(但不是 B)的成员变量。接下来对 classB 执行相同的操作。

于 2010-01-28T16:20:28.787 回答
2

您可以在 B 的头文件中转发声明 A,反之亦然,以实现您想要的。

// In B.h
class A;

class B
{
  private:
    A a;
};

有关更多信息,请参阅维基百科

于 2010-01-28T16:20:39.677 回答
1

如果你的意思是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;告诉编译器AandB是类。这些被称为“前向声明”。

于 2010-01-28T17:22:19.670 回答