2

我有这样的情况

在文件 GameServer.h 中:

class ServerGameStruct; //I can't simply include ServerGameStruct.h
                        // because of cyclic dependency
class GameServer {
public:
    class Client { };
private:
    ServerGameStruct gameStructure_;
}

并在文件 ServerGameStruct.h

#include "GameServer.h"

class ServerGameStruct {
public:
    typedef GameServer::Client Client;
    // some method which use type Client *
    // no class members with type Client 
}

编译后我得到错误 GameServer::gameStructure_ 使用未定义的类 GameServerStruct。

如何解决这种头部循环依赖?

4

4 回答 4

1

最简单的解决方案是制作gameStructure_一个指针:

std::unique_ptr<ServerGameStruct> gameStructure_;

原因是指向类的指针不需要声明类的完整定义。当你声明一个类的直接实例时,比如在你的代码中,那么你需要类的完整定义。

您也可以将其设为引用,但必须在GameServer构造函数中对其进行初始化。

于 2013-05-28T12:40:31.363 回答
0

使用指针

ServerGameStruct* gameStructure_;

在这种情况下,您需要手动处理 ServerGameStruct 的生命周期。智能指针可以帮助您做到这一点

于 2013-05-28T12:39:22.883 回答
0

您需要创建gameStructure_一个(智能)指针或引用,因此那里不需要其类型定义。如果你使用指针,你需要一个析构函数,即使它是空的,在 cpp 文件中,这样你(或者最好是你的智能指针)可以删除完整的类型。

于 2013-05-28T12:39:49.730 回答
0

另一种方法是引入抽象类型,例如AbstractGameClient. 这种类型可以提供接口ServerGameStruct需求,然后GameServer::Client将派生自AbstractGameClient. 为了显示:

AbstractGameClient.h

class AbstractGameClient {
protected:
  AbstractGameClient();
  virtual ~AbstractGameClient();
public:
  void somePublicMember() const;
  virtual void somePublicMemberTheSubclassMustSupply() const = 0;
};

游戏服务器.h

class GameServer {
public:
    class Client : public AbstractGameClient {
      virtual void somePublicMemberTheSubclassMustSupply() const { ... }
      ...
    };
private:
    ServerGameStruct gameStructure_;
};

服务器游戏结构.h

#include "AbstractGameClient.h" // << or just a forward of AbstractGameClient,
                                //    then use AbstractGameClient in the *.cpp

class ServerGameStruct {
public:
  void something(AbstractGameClient& pGameClient) {
    pGameClient.somePublicMember();
    pGameClient.somePublicMemberTheSubclassMustSupply();
  }
};
于 2013-05-28T13:01:10.533 回答