Выделение неизвестного унаследованного класса из другой динамической библиотеки ⇐ C++
Выделение неизвестного унаследованного класса из другой динамической библиотеки
Я работаю над небольшим проектом игрового движка и хочу создать систему распределения сущностей.
Идея такова: DLL движка «неизменяема», предоставлена мной. Разработчики смогут сами скомпилировать игровую DLL с настраиваемыми типами сущностей.
Каждая сущность является производной от класса CBase Engine. Сущности имеют имена классов, которые будут использоваться при чтении карты. Сущности будут «порождены» с использованием этих имен классов. По сути, это псевдоним этого объекта.
Но есть проблема:
Выделение «порожденных» объектов должно выполняться в движке. Движок должен иметь возможность вызывать основные функции и не сможет вызывать дополнительные функции.
Но Engine не импортирует эти классы из игровой DLL, поэтому я не могу просто использовать new EntityClass
Как выделить неизвестные классы (производные из известного класса) из другой DLL? Есть ли способ «передать тип» через функции?
Мой обходной путь раньше был похож на этот псевдокод:
Двигатель:
класс DLLEXPORT CBase { std::string имя класса; виртуальная пустота Init(); виртуальная пустота OtherMethod(); } CBase* CreateNewEntity(const char* имя класса) { CBase* newentity = static_cast(SERVER_DLL_GETNEWOBJECT(имя класса)); новый объект->Init(); entitylist.addentity(новая сущность); } Игровая DLL:
класс DLLEXPORT CBaseEntity: общедоступный DLLIMPORT CBase { //Вызывается движком виртуальное переопределение void Init(); переопределение виртуальной пустоты OtherFunction(); //Недоступно движку переопределение виртуальной пустоты AnotherFunction(); } CBaseEntity* SERVER_DLL_GETNEWOBJECT(const char* имя класса) { if (strcmp(className, "Entity_Weapon_Test") == 0) { return static_cast(новый CTestWeapon); } еще вернуть нульптр; } SERVER_DLL_GETNEWOBJECT экспортируется из игровой DLL и импортируется в серверную DLL. Это должна была быть предопределенная функция.
Но в этом обходном пути выделение осуществляется игровой DLL, а не движком. Поэтому я не могу его использовать.
Я работаю над небольшим проектом игрового движка и хочу создать систему распределения сущностей.
Идея такова: DLL движка «неизменяема», предоставлена мной. Разработчики смогут сами скомпилировать игровую DLL с настраиваемыми типами сущностей.
Каждая сущность является производной от класса CBase Engine. Сущности имеют имена классов, которые будут использоваться при чтении карты. Сущности будут «порождены» с использованием этих имен классов. По сути, это псевдоним этого объекта.
Но есть проблема:
Выделение «порожденных» объектов должно выполняться в движке. Движок должен иметь возможность вызывать основные функции и не сможет вызывать дополнительные функции.
Но Engine не импортирует эти классы из игровой DLL, поэтому я не могу просто использовать new EntityClass
Как выделить неизвестные классы (производные из известного класса) из другой DLL? Есть ли способ «передать тип» через функции?
Мой обходной путь раньше был похож на этот псевдокод:
Двигатель:
класс DLLEXPORT CBase { std::string имя класса; виртуальная пустота Init(); виртуальная пустота OtherMethod(); } CBase* CreateNewEntity(const char* имя класса) { CBase* newentity = static_cast(SERVER_DLL_GETNEWOBJECT(имя класса)); новый объект->Init(); entitylist.addentity(новая сущность); } Игровая DLL:
класс DLLEXPORT CBaseEntity: общедоступный DLLIMPORT CBase { //Вызывается движком виртуальное переопределение void Init(); переопределение виртуальной пустоты OtherFunction(); //Недоступно движку переопределение виртуальной пустоты AnotherFunction(); } CBaseEntity* SERVER_DLL_GETNEWOBJECT(const char* имя класса) { if (strcmp(className, "Entity_Weapon_Test") == 0) { return static_cast(новый CTestWeapon); } еще вернуть нульптр; } SERVER_DLL_GETNEWOBJECT экспортируется из игровой DLL и импортируется в серверную DLL. Это должна была быть предопределенная функция.
Но в этом обходном пути выделение осуществляется игровой DLL, а не движком. Поэтому я не могу его использовать.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение