ПрограммированиеФорумОбщее

Как вообще может выглядеть структура мультиплатформенного движка? Прошу совета и наставления :) (3 стр)

Страницы: 1 2 3
#30
0:48, 31 мая 2014

MoonStone, не нужно уродовать классы макросами.

В движке вы подключаете файл platform.h

Который подключает весь платформозависимый стафф.

+ Показать

К движку подключаются обычные классы (без всяких макросов), у которых для всех платформ одни и те же имена самих классов и методов.
А вот реализация нигде наружу не торчит.

Таким образом все платформо-зависимое скрыто внутри платформо-зависимых классов.

Фактически, это тоже самое, как если бы вы настроили систему сборки  так, что бы для разных платформ был разный состав файлов. Только это будет сделано препроцессором с++, а не системой сборки конкретной ИДЕ.

#31
1:28, 31 мая 2014

Kartonagnick, спасибо! Да, на данный момент я уже избавился от платформозависимых дефайнов внутри кода.
По сути, предложенный вариант - это второй вариант из нулевого поста, как раз (просто я там с его описанием перемудрил).
Но в нём мне не хватало возможности запилить комбинированные классы (кроссплатформ + платформспецифик методы в одном классе), да без копипасты одинакового функционала (ведь нельзя же просто банально обернуть все низкоуровневые функции - иногда даже их наборы в целом совершенно разные и все эти наборы хочется грамотно разложить по классам).

Поэтому я уже позарился на третий вариант, описанный в посте #29.
В нём, выходит, можно делать и комбинированные классы, причём можно наследоваться и от кроссплатформа, дописав туда платформозависимый код, а если прижмёт, то и наоборот тоже: наследоваться от платформозависимого класса и впаять туда какой-то общий код (навряд ли такое понадобится, конечно, но наличие возможности успокаивает :-) ).

Только переиначил немного макросики до такого вида:

#define CAT_0(a, b) a##b
#define CAT(a, b) CAT_0(a, b)
#define CAT_ENGINE_PLATFORM(a) CAT(a, ENGINE_PLATFORM)
#define DECLARE_CROSSPLATFORM_CLASS(c) class c : public CAT_ENGINE_PLATFORM(c) {}

#define ENGINE_PLATFORM _OSX

DECLARE_CROSSPLATFORM_CLASS(CEngineGUIWindow); // Получаем запись формата "class CEngineGUIWindow : public CEngineGUIWindow_OSX {};"

Таки подумал насчёт такого завёрнутого наследования и решил, что в уж моих-то масштабах, да в тех местах, где это требуется, выполнение этого кода всяко не доставит беспокойства.

Страницы: 1 2 3
ПрограммированиеФорумОбщее

Тема в архиве.