繁体   English   中英

C ++通告包括

[英]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();
}

两种方法:

  1. 保持相关类在同一H文件中
  2. 将依赖关系转换为抽象接口:GemElement实现IGemElement并期望IGemsGame,而GemsGame实现IGemsGame并包含IGemElement指针的向量。

看一下本主题的最高答案: 什么时候可以使用前向声明?

他确实解释了您需要了解的有关前向声明的所有内容,以及您对前向声明的类可以做什么和不能做什么。

看起来您正在使用类的前向声明,然后尝试将其声明为其他类的成员。 之所以失败,是因为使用前向声明使其成为不完整的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM