我希望有一个简单的答案。 没有太复杂我有两个班。一个“动物”和一个“细胞” Cell包含Animal作为成员。 Animal有一些方法可以在参数中接受Cell。
我只是对我如何#include每个类的其他标题感到困惑? 我只需要上一系列课程,然后在下一个课程中加入最后一个课程,依此类推,但这种循环情况让我有点失落。
我希望这是有道理的,任何帮助都非常感激。
答案 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
这样两个对象都可以完全使用另一个对象的功能(除了标题,但没关系)