Как создать фабрику классов из нескольких классов с разными классами, которые принимают разные параметры, но одинаковый ⇐ C++
Как создать фабрику классов из нескольких классов с разными классами, которые принимают разные параметры, но одинаковый
Я задаю этот вопрос здесь, чтобы услышать реальную человеческую точку зрения.
Я хочу создать фабрику классов со следующей сигнатурой: Компонент* (GameObject*, ...)
В некотором контексте это мой класс ComponentFactory:
.h
#pragma один раз // Зависимости | стандартный #include #include #include // Зависимости | CoreEngine #include "Component.h" #include "GameObject.h" класс ComponentFactory { // Объект публика: // Характеристики std::vector Factory = std::vector>(); // Конструктор/Деструктор Фабрика Компонентов(); ~ComponentFactory(); // Функции void addRegistry(const type_info* typeInfo, std::function constructor); Component* create(GameObject* gameObject, const type_info* typeInfo); }; .cpp
#include "ComponentFactory.h" // класс ComponentFactory // Объект | общественный // Конструктор/Деструктор ComponentFactory::ComponentFactory() { } ComponentFactory::~ComponentFactory() { } // Функции void ComponentFactory::addRegistry(const type_info* typeInfo, std::function конструктор) { std::pair реестр = std::pair(typeInfo, конструктор ); Factory.push_back(реестр); } Component* ComponentFactory::create(GameObject* gameObject, const type_info* typeInfo) { for (const std::pair& реестр: фабрика) если (регистрация.первый == typeInfo) вернуть реестр.секунду(gameObject); вернуть нульптр; } Проблема моего кода в том, что некоторые компоненты принимают в качестве аргумента нечто большее, чем просто GameObject*. Он должен иметь возможность возвращать Component*, первым параметром должен быть GameObject*, а затем любой другой параметр и любое их количество. Например: Компонент* (GameObject*, ...)
Цель состоит в том, чтобы передать const type_info* фабрике компонентов, GameObject и его аргументы и получить указатель Component* как результат.
Примечание. Моя фабрика компонентов должна быть объектом, поскольку мне нужны разные фабрики компонентов, и я пытаюсь построить связь имеет с гораздо большим кодом.
Примечание. Компонент — это класс, от которого наследуются другие классы.
Примечание. Каждый объект Component имеет переменную cont type_info* typeInfo. Его дети тоже.
В конечном итоге это должно выглядеть так: comComponentFactory.create(gameObject, *typeid(SomeClass, ...)
Вот пример JSON, который я читаю по запросу в разделе комментариев. Как только он прочитан, я пытаюсь создать указанные в нем объекты. Как видите, type_info.name() сохраняется в файле как type. Я сопоставляю это с type_info, хранящимся в фабрике компонентов.
{ "игровые объекты": [ { "идентификатор": 1, "name": "Игровой объект камеры", "трансформировать": { "позиция": [ 0,0, 0,0, 0,0 ], "ротация": [ 0,0, 0,0, 0,0 ], "шкала": [ 1,0, 1,0, 1.0 ] } } ], «transformRelationships»: ноль, "компоненты": [ { «gameObjectIndex»: 0, "type": "класс Camera2D", "данные": { «графикаКонтекстИндекс»: 0, «viewSize»: 16,0, "фоновый цвет": [ 0,15000000596046448, 0,15000000596046448, 0,15000000596046448, 1.0 ] } }, { «gameObjectIndex»: 0, "type": "класс CameraController", "данные": { "сила": 1.0 } }, { «gameObjectIndex»: 0, "type": "класс GameObjectController", "данные": { «сила»: 0,10000000149011612 } }, { «gameObjectIndex»: 0, "type": "класс EmptyComponent", "данные": {} } ] }
Я задаю этот вопрос здесь, чтобы услышать реальную человеческую точку зрения.
Я хочу создать фабрику классов со следующей сигнатурой: Компонент* (GameObject*, ...)
В некотором контексте это мой класс ComponentFactory:
.h
#pragma один раз // Зависимости | стандартный #include #include #include // Зависимости | CoreEngine #include "Component.h" #include "GameObject.h" класс ComponentFactory { // Объект публика: // Характеристики std::vector Factory = std::vector>(); // Конструктор/Деструктор Фабрика Компонентов(); ~ComponentFactory(); // Функции void addRegistry(const type_info* typeInfo, std::function constructor); Component* create(GameObject* gameObject, const type_info* typeInfo); }; .cpp
#include "ComponentFactory.h" // класс ComponentFactory // Объект | общественный // Конструктор/Деструктор ComponentFactory::ComponentFactory() { } ComponentFactory::~ComponentFactory() { } // Функции void ComponentFactory::addRegistry(const type_info* typeInfo, std::function конструктор) { std::pair реестр = std::pair(typeInfo, конструктор ); Factory.push_back(реестр); } Component* ComponentFactory::create(GameObject* gameObject, const type_info* typeInfo) { for (const std::pair& реестр: фабрика) если (регистрация.первый == typeInfo) вернуть реестр.секунду(gameObject); вернуть нульптр; } Проблема моего кода в том, что некоторые компоненты принимают в качестве аргумента нечто большее, чем просто GameObject*. Он должен иметь возможность возвращать Component*, первым параметром должен быть GameObject*, а затем любой другой параметр и любое их количество. Например: Компонент* (GameObject*, ...)
Цель состоит в том, чтобы передать const type_info* фабрике компонентов, GameObject и его аргументы и получить указатель Component* как результат.
Примечание. Моя фабрика компонентов должна быть объектом, поскольку мне нужны разные фабрики компонентов, и я пытаюсь построить связь имеет с гораздо большим кодом.
Примечание. Компонент — это класс, от которого наследуются другие классы.
Примечание. Каждый объект Component имеет переменную cont type_info* typeInfo. Его дети тоже.
В конечном итоге это должно выглядеть так: comComponentFactory.create(gameObject, *typeid(SomeClass, ...)
Вот пример JSON, который я читаю по запросу в разделе комментариев. Как только он прочитан, я пытаюсь создать указанные в нем объекты. Как видите, type_info.name() сохраняется в файле как type. Я сопоставляю это с type_info, хранящимся в фабрике компонентов.
{ "игровые объекты": [ { "идентификатор": 1, "name": "Игровой объект камеры", "трансформировать": { "позиция": [ 0,0, 0,0, 0,0 ], "ротация": [ 0,0, 0,0, 0,0 ], "шкала": [ 1,0, 1,0, 1.0 ] } } ], «transformRelationships»: ноль, "компоненты": [ { «gameObjectIndex»: 0, "type": "класс Camera2D", "данные": { «графикаКонтекстИндекс»: 0, «viewSize»: 16,0, "фоновый цвет": [ 0,15000000596046448, 0,15000000596046448, 0,15000000596046448, 1.0 ] } }, { «gameObjectIndex»: 0, "type": "класс CameraController", "данные": { "сила": 1.0 } }, { «gameObjectIndex»: 0, "type": "класс GameObjectController", "данные": { «сила»: 0,10000000149011612 } }, { «gameObjectIndex»: 0, "type": "класс EmptyComponent", "данные": {} } ] }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать экземпляры разных объектов, которые принимают одинаковые параметры?
Anonymous » » в форуме C# - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Создайте фабрику Singleton для класса, который принимает параметры/аргументы.
Anonymous » » в форуме C# - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему API управления выполнением CUDA принимают параметры ядра как неконтролируемая void **?
Anonymous » » в форуме C++ - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-