c ++在抽象类方面遇到麻烦

时间:2010-11-01 22:42:09

标签: c++ winapi visual-c++ class

我有这个课程可以帮助我使用动画网格物体。

class CAllocateHierarchy: public ID3DXAllocateHierarchy
{
public:
    STDMETHOD(CreateFrame)(THIS_ LPCTSTR Name, LPD3DXFRAME *ppNewFrame);
    STDMETHOD(CreateMeshContainer)(THIS_ LPCTSTR Name, LPD3DXMESHDATA pMeshData,
                            LPD3DXMATERIAL pMaterials, LPD3DXEFFECTINSTANCE pEffectInstances, DWORD NumMaterials, 
                            DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo, 
                            LPD3DXMESHCONTAINER *ppNewMeshContainer);
    STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME pFrameToFree);
    STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER pMeshContainerBase);
    CAllocateHierarchy(CMyD3DApplication *pApp) :m_pApp(pApp) {}
public:
    CMyD3DApplication* m_pApp;
};

但是当我尝试像CAllocateHierarchy allloc(this);那样安装一个类时,我会收到错误。 16 IntelliSense: object of abstract class type "CAllocateHierarchy" is not allowed: c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\monopoly.cpp 186

2 个答案:

答案 0 :(得分:5)

错误消息表明您没有覆盖接口ID3DXAllocateHierarchy中的所有抽象方法。

查看参数,我看到你忘记了CreateMeshContainer()方法的几个参数的“const”。因此,C ++编译器认为这是一个不同的方法,并抱怨原始的CreateMeshContainer()仍然是抽象的。

来自http://msdn.microsoft.com/en-us/library/bb205621(v=VS.85).aspx

HRESULT CreateMeshContainer(
  [in]           LPCSTR Name,
  [in]           const D3DXMESHDATA *pMeshData,
  [in]           const D3DXMATERIAL *pMaterials,
  [in]           const D3DXEFFECTINSTANCE *pEffectInstances,
  [in]           DWORD NumMaterials,
  [in]           const DWORD *pAdjacency,
  [in]           LPD3DXSKININFO pSkinInfo,
  [out, retval]  LPD3DXMESHCONTAINER *ppNewMeshContainer
);

所以解决方法是:将'const'添加到多个参数中(但请参阅下面的更新)。

更新:您的参数中也缺少一些'*'。显然你已经声明CreateMeshContainer按值获取参数,而它应该是const指针。从msdn链接复制粘贴声明并删除[in]标签可能是获得正确声明的最快方法。

建议:使用不同的编译器可能有助于生成更具洞察力的错误消息,因为可能会将警告级别设置得尽可能高。一些编译器列出了仍然是抽象的方法。某些编译器可能会警告您的CreateMeshContainer()没有覆盖接口中的虚拟CreateMeshContainer()。每一个错误的建议都会有所帮助。

答案 1 :(得分:1)

您的子类至少没有实现其基类的一个纯虚方法(标记为virtual whatever = 0)。您必须实现所有此类方法才能实例化您的子类。

相关问题