с ++ возникли проблемы с абстрактным классом - PullRequest
0 голосов
/ 02 ноября 2010

У меня есть этот класс, который поможет мне с анимированными сетками.

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 ]

5 голосов
/ 02 ноября 2010

Сообщение об ошибке указывает, что вы не переопределили все абстрактные методы из интерфейса ID3DXAllocateHierarchy.

Просматривая аргументы, я вижу, что вы забыли «const» для нескольких аргументов CreateMeshContainer ()метод.В результате компилятор C ++ думает, что это другой метод, и жалуется, что оригинальный CreateMeshContainer () по-прежнему абстрактный.

From 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 голос
/ 02 ноября 2010

Ваш подкласс не реализует хотя бы один из чисто виртуальных методов (помеченных virtual whatever = 0) своего базового класса. Вы должны реализовать все такие методы, чтобы создать экземпляр вашего подкласса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...