2011-02-05 2 views
0

Я создаю игровой движок (в C++), который разбит на несколько проектов (компилируя для разделения DLL и libs на окна и общие объекты в linux), структура как следует следующим образом:Несколько вызовов Dll друг друга, хотя «главная» dll

        Main.exe 

            Engine.dll 

      Graphics Engine.dll Physics Engine.dll Sound Engine.dll ...dll 

Main.exe инициализирует новый двигатель, а затем двигатель создает графические, физические и звуковые двигатели. Все это прекрасно работает, но теперь я хочу, например, графический движок запускать функции, присутствующие в звуковом движке, но не напрямую, используя функцию в Engine.dll.

Однако есть проблема. Основное включает Engine, а Engine включает в себя графику, физику и звук. Если я сейчас расскажу о графике, физике и звуке, чтобы включить Engine, а также передать ссылку на объект двигателя на каждый соответствующий «подмотор», возникает проблема с круговыми зависимостями ...

Как я могу получить Графика, Физика и звуковой движок для связи с Главным двигателем (так как на данный момент это только односторонняя связь, где главный двигатель вызывает все функции подмодулей)?

ответ

1

Вы можете открыть интерфейс, используя абстрактный класс (т. Е. С чистыми виртуальными функциями) из Engine.dll. Затем реализуйте этот интерфейс в Engine.dll. Затем создайте экземпляр конкретного этого класса и передайте ссылку/указатель этого экземпляра (как ссылку/указатель абстрактного класса) на GraphicsEngine.dll. Теперь, когда GraphicsEngine должен взаимодействовать с Engine, он может использовать этот экземпляр. Поскольку вы используете только абстрактный класс, это не требует привязки GraphicsEngine.dll к Engine.dll. Таким образом, циклическая зависимость не будет.

Смежные вопросы