6

我无法解决这个循环依赖问题;总是得到这个错误:“不完整类型结构 GemsGame 的无效使用”我不知道为什么编译器不知道 GemsGame 的声明,即使我包含 gemsgame.h 两个类相互依赖(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
4

4 回答 4

3

删除#include指令,您已经声明了前向类。

如果您的 A 类在其定义中需要了解 B 类的详细信息,那么您需要包含 B 类的标题。如果A类只需要知道B类的存在,比如A类只持有​​一个指向B类实例的指针,那么前向声明就足够了,这种情况下#include不需要an。

于 2013-07-25T17:57:36.843 回答
2

如果你尊重指针并且函数是内联的,你将需要完整的类型。如果您为实现创建一个 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();
}
于 2013-07-25T17:56:00.470 回答
1

看这个话题的置顶回答:什么时候可以使用前向声明?

他真的解释了你需要知道的关于前向声明的一切,以及你可以和不能对你前向声明的类做什么。

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

于 2013-07-25T18:07:49.027 回答
1

两条出路:

  1. 将依赖类保存在同一个 H 文件中
  2. 将依赖项转化为抽象接口:GemElement 实现 IGemElement 并期待 IGemsGame,GemsGame 实现 IGemsGame 并包含 IGemElement 指针向量。
于 2013-07-25T17:58:02.067 回答