c++ - 对 OnResetDevice() 和 OnLostDevice() 的一般调用

标签 c++ inheritance com directx

这是一个与 DirectX 有关的 COM 问题。

因此,ID3DXSprite 和 ID3DXFont 以及许多其他 ID3DX* 对象都要求您在 d3d 设备丢失时调用 OnLostDevice() 并在设备重置时调用 OnResetDevice()。

我想做的是维护一个包含所有 ID3DX* 对象的数组,并在设备丢失或重置时对每个对象简单地调用 OnResetDevice() 和 OnLostDevice()。

但是我似乎找不到 ID3DX* 类的基类...它们似乎都以 COM 方式继承自 IUnknown。

有没有办法做到这一点,或者我是否必须维护单独的 ID3DXFont* 指针、ID3DXSprite* 指针等数组?

最佳答案

抱歉,没有通用的基类。

可以使用多重继承和模板来实现您想要的。像这样的东西(未经测试但希望你能明白)......

#include <d3dx9.h>
#include <vector>

using namespace std;

class DeviceLostInterface
{
public:
    virtual void onLost() = 0;
    virtual void onReset() = 0;
};

template <typename Base>
class D3DXWrapper : public Base, public DeviceLostInterface
{
public:
    virtual void onLost() { Base::OnLostDevice(); }
    virtual void onReset() { Base::OnResetDevice(); }
};


int main()
{
    // Wouldn't be set to null in real program
    D3DXWrapper<ID3DXSprite>* sprite = 0;
    D3DXWrapper<ID3DXFont>* font = 0;

    vector<DeviceLostInterface*> things;
    things.push_back(sprite);
    things.push_back(font);

    // This would be a loop...
    things[0]->onLost();
    things[1]->onLost();

}

这有点符合你的要求,但老实说,我真的不认为它很有用。您要么需要一些方法来知道将每个项目转换回什么,要么将指针保留在特定于类型的列表中,然后您还不如编写单独的代码来重置每种类型。

关于c++ - 对 OnResetDevice() 和 OnLostDevice() 的一般调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2471339/

相关文章:

c++ - 默认情况下,clang 中是否有一组已知的 `c++11` 功能不需要 `-std=c++11` ?

c++ - 如何使用管道通过文件在父子之间共享数据?

java - 继承与组合

.net - 如何将WPF应用程序制作为可以嵌入MS Excel中的OLE对象?

java - 我可以通过 JNA 从 Java 使用 COM 吗?

c++ - 从字符串中删除字符

javascript - Javascript 中是否需要类?它们对创建对象有什么影响?

c++ - 如何使用子类上重载的相同方法使工作可变参数方法继承

com - Heat.exe 无法从 64 位 COM DLL 获取 TypeLib 信息

c++ - 过滤 std::string 的 std::vector