0

私はゲームを開発しようとしていますが、ゲーム オブジェクトの作成と破棄の管理に問題があり、複数の人からファクトリ パターンの使用を提案されました。私は行ってファクトリ パターンを読み、それを実装しようとしましたが、障害にぶつかりました。

// inside of EnemyGuy.h
#pragma once
#include "Entity.h"
#include "EntityFactory.h"
class EnemyGuy: public Entity {
public:
    void update();
}

//inside of EnemyGuy.cpp
#include "EnemyGuy.h"
void EnemyGuy::update(){
    if (you see player)
        Entity* shotFired = EntityFactory::create("bullet", params);
}

// inside of EntityFactory.h
#pragma once
class Entity
#include "Bullet.h"
#include "EnemyGuy.h"
class EntityFactory{
public:
    static Entity* create(const std::string passed, params);
}

// inside of EntityFactory.cpp
#include "EntityFactory.h"
 static Entity* create(const std::string passed, params){
    if (passed == "bullet")
        return new Bullet(params);
    if (passed == "enemyguy")
        return new EnemyGuy(params);
 }

ファクトリに EnemyGuy を含めてインスタンスを作成できるようにする必要があり、次に、EnemyGuy にファクトリを含めて create() メソッドを呼び出せるようにする必要があるため、循環依存エラーが発生します。

通常、前方宣言を使用して循環依存関係を解除しますが、この場合、前方宣言はそれを行いません。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

ファクトリ ヘッダー ファイルに含める必要はありません。宣言と実装を分離すれば問題ありません。

EntityFactory.h:

class Entity

class EntityFactory{ public:
     static Entity* create(const std::string passed, params);
}

EntityFactory.cpp:

#include "EntityFactory.h"
#include "Bullet.h"
#include "EnemyGuy.h"

 Entity* EntityFactory::create(const std::string passed, params){
     if (passed == "bullet")
         return new Bullet(params);
     if (passed == "enemyguy")
         return new EnemyGuy(params);
 }

新しいオプションをいくつ追加しても、ファクトリ ヘッダー ファイルと宣言は変更されないという考え方です。

于 2012-06-14T22:22:16.410 に答える