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

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;
};

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();
  }
};
于 2013-05-28T13:01:10.533 に答える