[英]C++ circular include
我无法解决这个循环依赖问题。 总是会收到此错误:“无效使用了不完整类型的结构GemsGame”,即使我包含gemsgame.h,我也不知道为什么编译器不知道GemsGame的声明。两个类彼此依赖(GemsGame存储GemElements的向量,并且GemElements需要访问相同的向量)
这是GEMELEMENT.H的部分代码:
#ifndef GEMELEMENT_H_INCLUDED
#define GEMELEMENT_H_INCLUDED
#include "GemsGame.h"
class GemsGame;
class GemElement {
private:
GemsGame* _gemsGame;
public:
GemElement{
_gemsGame = application.getCurrentGame();
_gemsGame->getGemsVector();
}
};
#endif // GEMELEMENT_H_INCLUDED
...以及GEMSGAME.H:
#ifndef GEMSGAME_H_INCLUDED
#define GEMSGAME_H_INCLUDED
#include "GemElement.h"
class GemsGame {
private:
vector< vector<GemElement*> > _gemsVector;
public:
GemsGame() {
...
}
vector< vector<GemElement*> > getGemsVector() {
return _gemsVector;
}
}
#endif // GEMSGAME_H_INCLUDED
删除#include
指令,您已经有向前声明的类。
如果您的类A在其定义中需要了解有关类B的详细信息,那么您需要包括类B的标头。 如果类A仅需要知道类B的存在,例如,当类A仅持有指向类B实例的指针时,则只需进行前声明就可以了,在这种情况下,不需要#include
。
如果您使用指针,并且该函数是内联函数,则将需要完整类型。 如果为实现创建一个cpp文件,则可以避免循环依赖(因为两个类都不需要在其标头中包含彼此.h)
像这样:
您的标题:
#ifndef GEMELEMENT_H_INCLUDED
#define GEMELEMENT_H_INCLUDED
class GemsGame;
class GemElement {
private:
GemsGame* _gemsGame;
public:
GemElement();
};
#endif // GEMELEMENT_H_INCLUDED
您的cpp:
#include "GenGame.h"
GenElement::GenElement()
{
_gemsGame = application.getCurrentGame();
_gemsGame->getGemsVector();
}
两种方法:
看一下本主题的最高答案: 什么时候可以使用前向声明?
他确实解释了您需要了解的有关前向声明的所有内容,以及您对前向声明的类可以做什么和不能做什么。
看起来您正在使用类的前向声明,然后尝试将其声明为其他类的成员。 之所以失败,是因为使用前向声明使其成为不完整的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.