У меня есть класс Engine, который содержит и владеет некоторыми системами. Класс Engine имеет два контейнера, одну карту и один вектор. Оба хранят указатели на системы.
Шаблонная функция addSystem должна добавить в карту указатель на новую Систему нужного типа, а addToPipeline должна добавить указатель на Систему, переданную в качестве параметра в векторе. Я использовал для этого shared_ptrs, но я делаю что-то не так, потому что я получаю двойную бесплатную ошибку, если использую функцию addToPipeline.
Вот упрощенный класс Engine:
class Engine
{
public:
template <class T>
T& addSystem();
void addToPipeline(System&);
private:
std::map<std::type_index, std::shared_ptr<System>> m_systems;
std::vector<std::shared_ptr<System>> m_pipeline;
};
void Engine::addToPipeline(System& sys)
{
m_pipeline.push_back(std::shared_ptr<System>(&sys));
}
template <class T>
T& Engine::addSystem()
{
std::shared_ptr<T> system = std::make_shared<T>();
auto inserted = m_systems.emplace(typeid(T),system);
return static_cast<T&>(*(*inserted.first).second);
}
Функции следует использовать, как показано ниже:
auto& POSITION_SYSTEM = engine.addSystem<PositionSystem>();
engine.addToPipeline(POSITION_SYSTEM);
Любая помощь приветствуется!