c++ 抽象类有问题

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

我有这个类(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:不允许抽象类类型“CAllocateHierarchy”的对象:c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\monopoly.cpp 186

最佳答案

错误消息表明您没有覆盖接口(interface) 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() 没有覆盖接口(interface)中的虚拟 CreateMeshContainer()。每一个错误的建议都可能有所帮助。

关于c++ 抽象类有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073706/

相关文章:

c++ - 我应该使用 rand() 还是 rand_r()?

c++ - 在具有虚函数的类上调用 std::visit 是否安全?

c++ - 在子类中重写时如何调用私有(private)虚拟基类实现

c++ - 子类化后编辑控件无法获得焦点或设置文本

visual-c++ - 使用CString::Format时如何防止C6284?

c++ - 使用模板化 comp 函数实现 unique_copy - 类型推断

winapi - ARM 是否支持 kernel32.dll 和 shell32.dll?

c++ - 在汇编文件中调用 C++ 函数

c# - VS Express和专业有冲突吗?

c++ - 从 hIcon/hBitmap 获取字节/char*