2010-11-01 90 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)。你必須實現所有這些方法才能實例化你的子類。