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

Смежные вопросы