2009-02-28 3 views
2

В настоящее время я работаю над sprite-движком на C++. У меня есть абстрактный класс IEngine с виртуальной функцией init_api. Это принимает пустоту *.void * as unknown variable type

// Initialise the engines' API 
// api_params - void* to api parameters for initalisation 
// hWnd - window handle 
virtual bool init_api(void* api_params, HWND hWnd) = 0; 

У меня тогда есть встроенный в DirectX класс двигателя CEngineDX. Затем он передает api_params в D3DPRESENT_PARAMETERS *, поэтому его можно использовать для инициализации DirectX.

// Cast api_params to a D3DPRESENT_PARAMETERS 
D3DPRESENT_PARAMETERS* presentParams = NULL; 
presentParams = reinterpret_cast< D3DPRESENT_PARAMETERS* >(api_params); 

Я очень доволен этой установкой, но хотел бы получить некоторые другие программисты просматривать на этом «решения», если вам нравится.

Приветствия за ответы!

Карлы

ответ

1

Другой способ сделать это - просто иметь общий заголовок и разные файлы * .cpp для каждой реализации. Таким образом, вы можете включить только D3D или просто файлы OGL в свой проект. IMO лучше выбрать API во время компиляции, чтобы вы не связывались с обеими библиотеками.

Что касается пустоты *, мне это не очень нравится. Я думаю, вам будет лучше определять ваши собственные типы, а затем сопоставлять их с типами API с помощью структур/классов оболочки и typedef. Вы можете переслать объявить их и поместить фактическую реализацию в свои * .cpp-файлы.

Другим преимуществом этого метода является то, что вы не платите за виртуальные функции, которые вам не нужны, хотя я понимаю, что стоимость виртуального вызова довольно мала.

1

Это относительно общая проблема, с изменением типов аргументов в иерархии наследования; ваш подкласс хочет специализировать тип «api_params» из родительского класса.

Я думаю, что все в порядке, но это C-like. Я думаю, что лучшим решением было бы сделать init_api не виртуальным и реализовать его с правильным типом в подклассе. В любом случае, скорее всего, структура D3DPRESENT_PARAMETERS имеет смысл только с движком DirectX, так почему бы не включить ее в подкласс, где он логически принадлежит?

+0

Спасибо за ваш ввод. :П –

0

Мне не нравится этот API. Зачем использовать указатель void? Почему бы не сделать первый параметр указателем или ссылкой на D3DPRESENT_PARAMETERS? Вы знаете, что это должно быть так или иначе? Это более безопасно.

1

Ну, вы можете использовать шаблоны (вам не нравятся приведения), но ваша иерархия должна будет идти в этом случае.

template<class T> 
struct Engine { 
    bool init_api(const T& params, HWND hWnd); 
}; 

//specialize for DirectX 
template<> 
struct Engine <D3DPRESENT_PARAMETERS> { 
    bool init_api(const D3DPRESENT_PARAMETERS& params, HWND hWnd) { 
    return true; 
    } 
}; 

Но используйте что-то, что вписывается в грандиозную схему вещей.