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()方法。

通常情況下,你會打破一個循環依賴與一個前向聲明,但在這種情況下,一個前向聲明不會這樣做。 我該如何解決這個問題?

回答

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

的想法是,工廠的頭文件和申報從未變化,不管你有多少新的選項添加到它。

+0

真棒謝謝 – user1438585