Я пытаюсь реализовать шаблон ECS для видеоигры на C++.
Три элемента шаблона в основном представлены менеджером (EntityManager, ComponentManager, System Manager), которые определены и реализованы в трех разных файлах .h (из-за использования шаблона).
Я также создал класс координатора в другом .h файле, который имеет ссылки на экземпляры всех трех классов менеджеров, поэтому мне пришлось включить в него заголовочный файл менеджеров.
Системный менеджер (ну, на самом деле конкретные системы, которые у меня были для реализации) должен иметь ссылку на класс Координатора, чтобы получить компонент из других объектов. Следовательно, файл .h для общей системы также должен включать .h класса Координатора, создавая тем самым циклическую зависимость заголовка.
Я не смог решить эту проблему с помощью простого предварительного объявления, поскольку мне нужно фактически вызывать методы класса Координатора (который на данный момент является синглтоном).
Ошибка, которую выдает Visual Studio 2019:
"Ошибка LNK2005, ...," уже определена в ...)
Есть ли способ решить эту проблему, сохранив описанную структуру?
Заранее спасибо!
Coordinator.hpp
#pragma once
#include "EntityManager.hpp"
#include "ComponentManager.hpp"
#include "SystemManager.hpp"
SystemManager.hpp
#pragma once
#include "System.hpp"
System.hpp
#pragma once
PhysicsSystem.hpp
#pragma once
#include "../Core/System.hpp"
class PhysicsSystem : public System
{
public:
void Update(float dt);
};
PhysicsSystem.cpp
#include "PhysicsSystem.hpp"
#include "../Core/Coordinator.hpp"
void PhysicsSystem::Update(float dt)
{
Coordinator* coordinator = Coordinator::GetInstance();
};
Подробнее здесь: https://stackoverflow.com/questions/775 ... ncy-in-ecs