我正在尝试开发游戏,我在管理游戏对象的创建和销毁方面存在问题,并且有几个人建议尝试使用工厂模式。 我去了解工厂模式,我正在尝试实施它,我遇到了障碍。
// 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()方法。
通常你会使用前向声明来破坏循环依赖,但在这种情况下,前向声明不会这样做。 我该如何解决这个问题?
答案 0 :(得分: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);
}
这个想法是工厂头文件和声明从不更改,无论您添加了多少新选项。