C ++:2个类如何相互调用而无需重新声明,并且没有标题相互调用

时间:2010-01-28 16:17:22

标签: c++ oop header-files

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

的标题中添加它
#ifndef A
#define A
  class a...
#endif

但是如果让我进入一个无限的头部循环,它到达最大的头部包含,那么显然一个人正在调用另一个而另一个正在调用那个。有没有办法实现这个目标?

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

6 个答案:

答案 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)

你可以在B的头文件中转发声明A,反之亦然,以达到你想要的效果。

// In B.h
class A;

class B
{
  private:
    A a;
};

有关详细信息,请参阅Wikipedia

答案 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;之类的东西告诉编译器AB是类。这些被称为“前瞻性声明”。