两个类包含彼此的对象

时间:2010-05-08 09:49:32

标签: c++

我希望有一个简单的答案。 没有太复杂我有两个班。一个“动物”和一个“细胞” Cell包含Animal作为成员。 Animal有一些方法可以在参数中接受Cell。

我只是对我如何#include每个类的其他标题感到困惑? 我只需要上一系列课程,然后在下一个课程中加入最后一个课程,依此类推,但这种循环情况让我有点失落。

我希望这是有道理的,任何帮助都非常感激。

7 个答案:

答案 0 :(得分:3)

您可以使用前向声明来克服循环引用的问题。

示例:

//animal.h

#include "cell.h"

class Animal {
public:
    void foo (Cell cell);
}

// cell.h

class Animal; // forward declaration

class Cell {
private:
    Animal * m_animal; // pointer to Animal object
}

答案 1 :(得分:2)

您需要转发声明其中一个类,以便编译器知道它。有点像,有这个类“动物”,我会告诉你它后来是什么。

示例:

class Animal;

class Cell
{
    Animal *a;
};

class Animal
{
    Cell *c;
};

正如Gareth在评论中指出的那样,您可能无法转发声明将通过值传递的内容。这是因为编译器只能处理它知道大小的类型。指向任何事物的指针总是大小相同,因此编译器确实需要在上面的示例中完全定义Animal。

这不起作用:

class Animal;

class Cell
{
    Animal a; // compiler needs to know how Animal is defined
}             // and so will fail at this point

答案 2 :(得分:1)

使用forward declarations处理循环依赖关系(滚动到页面底部)。

答案 3 :(得分:1)

如果Cell包含Animal成员,则在Animal定义之前需要Cell的完整定义,因此您需要#include标题从定义Animal的标头定义Cell

#include "animal.h"

class Cell
{
    // ...
    Animal animal; // animal member
};

如果Animal的方法采用或返回Cell(无论是通过引用还是值),那么您可以在Cell的定义之前转发声明Animal

// animal.h
class Cell;

class Animal
{
    // declarations of Animal methods
};

答案 4 :(得分:1)

animal.h:

class Cell; // fwd declaration

// Cell is now an "incomplete type"

class Animal {
    void Respirate( Cell & ); // reference: no need for complete type
};

cell.h:

#include "animal.h"

class Cell {
    Animal organism; // conceptually, a reference or pointer would be better
};

OR

class Animal

class Cell {
    Animal *organism; // Cell "knows about an" animal rather than "has an"
};

答案 5 :(得分:0)

两个类都不可能包含另一个类型的对象 - 其中一个或两个类必须包含指向另一个类型的指针。

答案 6 :(得分:0)

您可以转发声明,但这并不能完全解决问题,它只允许您声明指向该对象的指针,而不是使用该对象内的任何函数/成员。你可以这样做:

Animal.h

class Cell;

class Animal {
  private:
  Cell cell;
};

Animal.cpp

#include "Animal.h"
#include "Cell.h"

// Animal functions can use members/functions in Cell object here

Cell.h

class Animal;

class Cell
{
  private:
    Animal animal;
};

Cell.cpp

#include "Animal.h"
#include "Cell.h"

// Cell functions can use members/functions in Animal object here

这样两个对象都可以完全使用另一个对象的功能(除了标题,但没关系)