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

C++ 对OnResetDevice()和OnLostDevice()的一般调用,c++,inheritance,com,directx,C++,Inheritance,Com,Directx,这是一个与DirectX有关的COM问题 因此,ID3DXSprite和ID3DXFont以及一系列其他ID3DX*对象都要求您在d3d设备丢失时调用OnLostDevice(),在设备重置时调用OnResetDevice() 我要做的是维护一个包含所有ID3DX*对象的数组,只要在设备丢失或重置时对每个对象调用OnResetDevice()和OnLostDevice() 但是我似乎找不到ID3DX*类的基类。。。他们似乎都是从IUnknown继承来的 有没有办法做到这一点,或者我必须维护ID3

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

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

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

但是我似乎找不到ID3DX*类的基类。。。他们似乎都是从IUnknown继承来的


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

对不起,没有公共基类

您可以使用多个继承和模板来实现所需的排序。类似这样的东西(未经测试,但希望你能理解)

#包括
#包括
使用名称空间std;
类DeviceLostInterface
{
公众:
虚拟void onLost()=0;
虚拟void onReset()=0;
};
模板
D3DXWrapper类:公共基,公共DeviceLostInterface
{
公众:
虚拟void onLost(){Base::OnLostDevice();}
虚拟void onReset(){Base::OnResetDevice();}
};
int main()
{
//在实际程序中不会设置为null
D3DXWrapper*sprite=0;
D3DXWrapper*font=0;
向量事物;
事物。推回(精灵);
事物。推回(字体);
//这将是一个循环。。。
事物[0]->onLost();
事物[1]->onLost();
}
这种方法符合你的要求,但老实说,我并不认为它很有用。您可能需要一些方法来知道将每个项强制转换回什么,或者将指针保留在特定类型的列表中,然后您也可以编写单独的代码来重置每个类型

#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();

}