我目前正在用 C++ 开发 Sprite 引擎。我有一个带有虚函数 init_api 的抽象类 IEngine。这需要一个空*。
// 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 );
我对这个设置非常满意,但如果您愿意,我想让其他程序员了解这个“解决方案”。
为回复干杯!
卡尔
最佳答案
另一种方法是为每个实现提供一个公共(public) header 和不同的 *.cpp 文件。这样您就可以在项目中仅包含 D3D 或 OGL 文件。 IMO 最好在编译时选择 API,这样就不会链接两个库。
至于void*,我不太喜欢它。我认为您最好定义自己的类型,然后使用包装器结构/类和 typedef 将它们映射到 API 类型。您可以转发声明这些内容,并将实际实现放入 *.cpp 文件中。
此方法的另一个好处是,您无需为不需要的虚拟函数付费,尽管我意识到虚拟调用的成本非常小。
关于c++ - void* 作为未知变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597436/