我有这样的情况
在文件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的错误。
如何解决那种头的循环依赖?
答案 0 :(得分:1)
最简单的解决方案是使gameStructure_
成为指针:
std::unique_ptr<ServerGameStruct> gameStructure_;
原因是指向类的指针不需要声明的类的完整定义。当你声明一个类的直接实例时,就像你的代码一样,那么你需要完整的类定义。
您也可以将其作为参考,但是您必须在GameServer
构造函数中对其进行初始化。
答案 1 :(得分:0)
使用指针
ServerGameStruct* gameStructure_;
在这种情况下,您需要手动处理ServerGameStruct的生命周期。智能指针可以帮助你做到这一点
答案 2 :(得分:0)
您需要使gameStructure_
成为(智能)指针或引用,因此不需要其类型定义。如果使用指针,那么在cpp文件中你需要一个析构函数,即使它是空的,所以你(或者最好是你的智能指针)可以删除完整的类型。
答案 3 :(得分:0)
另一种方法是引入抽象类型,例如AbstractGameClient
。此类型可以提供界面ServerGameStruct
需求,然后GameServer::Client
将派生自AbstractGameClient
。举例说明:
AbstractGameClient.h
class AbstractGameClient {
protected:
AbstractGameClient();
virtual ~AbstractGameClient();
public:
void somePublicMember() const;
virtual void somePublicMemberTheSubclassMustSupply() const = 0;
};
GameServer.h
class GameServer {
public:
class Client : public AbstractGameClient {
virtual void somePublicMemberTheSubclassMustSupply() const { ... }
...
};
private:
ServerGameStruct gameStructure_;
};
ServerGameStruct.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();
}
};