Зависимость циклического заголовка в ECSC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Зависимость циклического заголовка в ECS

Сообщение Anonymous »

Я пытаюсь реализовать шаблон 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»