2010-11-01 89 views
0

我有这个类可以帮助我制作动画网格。C++在抽象类中遇到问题

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; 
}; 

但是当我尝试intallizes一类像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

回答

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

因此,解决办法是: '常量' 添加到几个参数(见下文更新)。

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

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

+0

我很确定这是正确的,因为我即将发布相同的答案。 – dlanod 2010-11-01 22:49:46

+0

我做了什么让我告诉我把const的一些,但没有工作 – Ramilol 2010-11-01 23:07:33

+0

现在,我看近一些,我也注意到一些缺少'*'的参数:而不是预期的“const D3DXMESHDATA * pMeshData”,你宣布一个“LPD3DXMESHDATA pMeshData”。所以添加const是不够的。尝试通过粘贴我提供的MSDN链接参数来更新您的声明。 – Sjoerd 2010-11-01 23:10:15

1

您的子类不会实现其基类中的至少一种纯虚拟方法(标记为virtual whatever = 0)。你必须实现所有这些方法才能实例化你的子类。