Выделение неизвестного унаследованного класса из другой динамической библиотекиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Выделение неизвестного унаследованного класса из другой динамической библиотеки

Сообщение Anonymous »


Я работаю над небольшим проектом игрового движка и хочу создать систему распределения сущностей.

Идея такова: 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, а не движком. Поэтому я не могу его использовать.
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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