C ++ унаследованный класс 'Window': базовый класс не определен - PullRequest
0 голосов
/ 14 ноября 2010

когда я унаследовал классы, я получаю эти сообщения об ошибках.

1>c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\d3ddevice.h(6): error C2504: 'Window' : base class undefined
1>c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\d3ddevice.h(11): error C2061: syntax error : identifier 'CXFileEntity'
1>c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\window.h(20): error C2143: syntax error : missing ';' before '*'
1>c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\window.h(20): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\window.h(20): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

для первой ошибки я включил заголовочный файл Window.h (где определен класс окна) в d3ddevice.h, но все равно говорится, что он не определен. Вот мой исходный код для трех классов CXFileEntity, Window, D3dDevice
d3ddevice.h

#ifndef D3dDevice_H_
#define D3dDevice_H_
#include "Window.h"
#include "XfileEntity.h"
class Window;
class D3dDevice : public Window
{
public:
 D3dDevice(void);
 ~D3dDevice(void) { CleanUp(); };
 void InitD3D();
 void RenderFrame(CXFileEntity *m_entity);
 void CleanUp(void);
 void InitMatrices();
 int Height;          // BackBuffer Height
 int Width;          // BackBuffer Width
 LPDIRECT3D9 d3d;        // Pointer to our Direct3D interface
 LPDIRECT3DDEVICE9 d3ddev;      // Pointer to the device class
};

#endif

cfileentity.h

#ifndef XFileEntity_H_
#define XFileEntity_H_
/*
 This class represents an x file animation
 It loads the .x file and carries out the animation update and rendering
*/
#include "Window.h"
#include "MeshStructures.h"
class Window;
class CXFileEntity : public Window
{
private:
 LPDIRECT3DDEVICE9 m_d3dDevice; // note: a pointer copy (not a good idea but for simplicities sake)

 // Direct3D objects required for animation
 LPD3DXFRAME                 m_frameRoot;
    LPD3DXANIMATIONCONTROLLER   m_animController;
 D3DXMESHCONTAINER_EXTENDED* m_firstMesh;

 // Bone data
 D3DXMATRIX *m_boneMatrices;
 UINT m_maxBones;

 // Animation variables
 unsigned int m_currentAnimationSet;
 unsigned int m_numAnimationSets;
 unsigned int m_currentTrack;
 float m_currentTime;
 float m_speedAdjust;

 // Bounding sphere (for camera placement)
 D3DXVECTOR3 m_sphereCentre;
 float m_sphereRadius;

 std::string m_filename;

 void UpdateFrameMatrices(const D3DXFRAME *frameBase, const D3DXMATRIX *parentMatrix);
 void UpdateSkinnedMesh(const D3DXFRAME *frameBase);
 void DrawFrame(LPD3DXFRAME frame) const;
 void DrawMeshContainer(LPD3DXMESHCONTAINER meshContainerBase, LPD3DXFRAME frameBase) const;
 void SetupBoneMatrices(D3DXFRAME_EXTENDED *pFrame/*, LPD3DXMATRIX pParentMatrix*/); 
public:
 CXFileEntity(LPDIRECT3DDEVICE9 d3dDevice);
 ~CXFileEntity(void);
 D3DXMATRIX m_combinedMat;
 void CreateRay();

 bool Load(const std::string &filename);
 CXFileEntity* LoadXFile(const std::string &filename,int startAnimation, CXFileEntity *m_entitys);
 void FrameMove(float elapsedTime,const D3DXMATRIX *matWorld);

 void Render() const;
 void SetAnimationSet(unsigned int index);
 void SetComb(LPDIRECT3DDEVICE9 d3dDevice, D3DXMATRIX world);
 float m_fHitDist;
 CXFileEntity *m_pChild;
 CXFileEntity *m_pSibling;

 void NextAnimation();
 void AnimateFaster();
 void AnimateSlower();
 CXFileEntity *Pick(D3DXVECTOR3 *pvNear, D3DXVECTOR3 *pvDir, float maxDist, CXFileEntity *pObj);
 BOOL m_bHit;

 D3DXVECTOR3 GetInitialCameraPosition() const;
 unsigned int GetCurrentAnimationSet() const {return m_currentAnimationSet;}
 std::string GetAnimationSetName(unsigned int index);
 std::string GetFilename() const {return m_filename;}
};

#endif

window.h

#ifndef Window_H_
#define Window_H_
#include "D3dDevice.h"
#include "XfileEntity.h"
class Window
{
public:
 Window(void);
 ~Window(void);
 bool InitWindow(HINSTANCE hInstance, int nCmdShow);
 void InitMesh();
 ATOM MyRegisterClass(HINSTANCE hInstance);
 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
 int Run( HACCEL hAccelTable );
 static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 void Pick();
 HWND hWnd; 
 D3dDevice d3dx;
 CXFileEntity *m_entity;
private:
 HINSTANCE hInst;        // current instance         // current window
 TCHAR szTitle[MAX_LOADSTRING];     // The title bar text
 TCHAR szWindowClass[MAX_LOADSTRING];   // the main window class name
};
#endif

UPDATE

#ifndef Window_H_
#define Window_H_
class CXFileEntity;
class D3dDevice;
class Window
{
public:
    Window(void);
    ~Window(void);
    bool InitWindow(HINSTANCE hInstance, int nCmdShow);
    void InitMesh();
    ATOM MyRegisterClass(HINSTANCE hInstance);
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
    int Run( HACCEL hAccelTable );
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    void Pick();
    HWND hWnd;  
    D3dDevice d3dx;
    CXFileEntity *m_entity;
private:
    HINSTANCE hInst;                                // current instance                                 // current window
    TCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
};
#endif

1 Ответ

3 голосов
/ 14 ноября 2010

В ваших #include s есть циклические зависимости: d3ddevice.h включает Window.h, но Window.h, в свою очередь, включает d3ddevice.h.

Кроме того, ваш D3dDevice является производным от Window, но также содержится в Window как поле. Таким образом, каждый Window содержит D3dDevice в качестве поля, которое содержит Window в качестве части, которое содержит D3dDevice в качестве поля и так далее. В результате необходимая память для D3dDevice бесконечна.

Возможно, вы хотите иметь только указатель на D3dDevice в Window? Таким образом, вам не нужно #include "D3dDevice.h" в window.h, поэтому вы можете просто сделать предварительное объявление в window.h: class D3dDevice;, тем самым нарушив круговую зависимость.

Или, может быть, вам не нужно, чтобы D3dDevice был получен из Window?

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