标头混乱。编译器无法识别数据类型

时间:2010-05-24 13:24:30

标签: c++ c visual-studio visual-c++ directx

我对编译器无法识别我的类的原因感到困惑。所以我只是告诉你我的代码并让你们决定。我的错误是这个

error C2653: 'RenderEngine' : is not a class or namespace name

它正指向这一行

std::vector<RenderEngine::rDefaultVertex> m_verts;

以下是rModel的完整代码。它包含变量。持有它的阶层更进一步。

#ifndef _MODEL_H
#define _MODEL_H
#include "stdafx.h"
#include <vector>
#include <string>
//#include "RenderEngine.h"
#include "rTri.h"

class rModel {
public:

    typedef tri<WORD> sTri;

    std::vector<sTri> m_tris;
    std::vector<RenderEngine::rDefaultVertex> m_verts;

    std::wstring m_name;

    ID3D10Buffer *m_pVertexBuffer;
    ID3D10Buffer *m_pIndexBuffer;

    rModel( const TCHAR *filename );
    rModel( const TCHAR *name, int nVerts, int nTris );

    ~rModel();

    float GenRadius();
    void Scale( float amt );
    void Draw();

    //------------------------------------ Access functions.
    int NumVerts(){ return m_verts.size(); }
    int NumTris(){ return m_tris.size(); }
    const TCHAR *Name(){ return m_name.c_str(); }

    RenderEngine::cDefaultVertex *VertData(){ return &m_verts[0]; }
    sTri *TriData(){ return &m_tris[0]; }

};

#endif

在代码的最顶部有一个头文件

#include "stdafx.h"

包含此

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource.h"
#include "d3d10.h"
#include "d3dx10.h"
#include "dinput.h"
#include "RenderEngine.h"
#include "rModel.h"


// TODO: reference additional headers your program requires here

如您所见,RenderEngine.h位于rModel.h之前

#include "RenderEngine.h"
    #include "rModel.h"

据我所知,它应该认识到它。但另一方面,我对组织标题并不是那么好。这是我的RenderEngine宣言。

#pragma once
#include "stdafx.h"



#define MAX_LOADSTRING 100
#define MAX_LIGHTS 10

class RenderEngine {
public:
    class rDefaultVertex
    {
    public:
        D3DXVECTOR3 m_vPosition;  
        D3DXVECTOR3 m_vNormal;
        D3DXCOLOR m_vColor;
        D3DXVECTOR2 m_TexCoords;
    };

    class rLight
    {
    public:
        rLight()
        {

        }
        D3DXCOLOR m_vColor;
        D3DXVECTOR3 m_vDirection;
    };

    static HINSTANCE m_hInst;
    HWND m_hWnd;
    int m_nCmdShow;
    TCHAR m_szTitle[MAX_LOADSTRING];                    // The title bar text
    TCHAR m_szWindowClass[MAX_LOADSTRING];          // the main window class name

    void DrawTextString(int x, int y, D3DXCOLOR color, const TCHAR *strOutput);

    //static functions
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    static INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

    bool InitWindow();
    bool InitDirectX();
    bool InitInstance();
    int Run();
    void ShutDown();

    void AddLight(D3DCOLOR color, D3DXVECTOR3 pos);

    RenderEngine()
    {
        m_screenRect.right = 800;
        m_screenRect.bottom = 600;
        m_iNumLights = 0;
    }
protected:

    RECT m_screenRect;

    //direct3d Members
    ID3D10Device *m_pDevice; // The IDirect3DDevice10
    // interface
    ID3D10Texture2D *m_pBackBuffer; // Pointer to the back buffer
    ID3D10RenderTargetView *m_pRenderTargetView; // Pointer to render target view
    IDXGISwapChain *m_pSwapChain; // Pointer to the swap chain
    RECT m_rcScreenRect; // The dimensions of the screen

    ID3D10Texture2D *m_pDepthStencilBuffer;
    ID3D10DepthStencilState *m_pDepthStencilState;
    ID3D10DepthStencilView *m_pDepthStencilView;

    //transformation matrixs system
    D3DXMATRIX m_mtxWorld;
    D3DXMATRIX m_mtxView;
    D3DXMATRIX m_mtxProj;

    //pointers to shaders matrix varibles
    ID3D10EffectMatrixVariable* m_pmtxWorldVar;
    ID3D10EffectMatrixVariable* m_pmtxViewVar;
    ID3D10EffectMatrixVariable* m_pmtxProjVar;

    //Application Lights
    rLight m_aLights[MAX_LIGHTS]; // Light array
    int m_iNumLights; // Number of active lights

    //light pointers from shader
    ID3D10EffectVectorVariable* m_pLightDirVar;
    ID3D10EffectVectorVariable* m_pLightColorVar;
    ID3D10EffectVectorVariable* m_pNumLightsVar;

    //Effect members
    ID3D10Effect *m_pDefaultEffect;
    ID3D10EffectTechnique *m_pDefaultTechnique;
    ID3D10InputLayout* m_pDefaultInputLayout;

    ID3DX10Font *m_pFont; // The font used for rendering text
    // Sprites used to hold font characters
    ID3DX10Sprite *m_pFontSprite;

    ATOM RegisterEngineClass();
    void DoFrame(float);
    bool LoadEffects();
    void UpdateMatrices();
    void UpdateLights();

};

类在类

中定义
class rDefaultVertex
        {
        public:
            D3DXVECTOR3 m_vPosition;  
            D3DXVECTOR3 m_vNormal;
            D3DXCOLOR m_vColor;
            D3DXVECTOR2 m_TexCoords;
        };

        class rLight
        {
        public:
            rLight()
            {

            }
            D3DXCOLOR m_vColor;
            D3DXVECTOR3 m_vDirection;
        };

不确定这是不是很好的做法,但我只是按照这本书去做。

最后,我只需要一个好方法来组织它,以便rModel识别RenderEngine。如果可能的话,反之亦然。

[编辑]

我可以直接指向渲染引擎类,它仍然无法识别

#ifndef _MODEL_H
#define _MODEL_H
//#include "stdafx.h"
#include <vector>
#include <string>
#include "RenderEngine.h"  //<-------pointing to render engine. still does not recognize.
#include "rTri.h"

class rModel {
public:

    typedef tri<WORD> sTri;

    std::vector<sTri> m_tris;
    std::vector<RenderEngine::rDefaultVertex> m_verts;

    std::wstring m_name;

    ID3D10Buffer *m_pVertexBuffer;
    ID3D10Buffer *m_pIndexBuffer;

    rModel( const TCHAR *filename );
    rModel( const TCHAR *name, int nVerts, int nTris );

    ~rModel();

    float GenRadius();
    void Scale( float amt );
    void Draw();

    //------------------------------------ Access functions.
    int NumVerts(){ return m_verts.size(); }
    int NumTris(){ return m_tris.size(); }
    const TCHAR *Name(){ return m_name.c_str(); }

    RenderEngine::cDefaultVertex *VertData(){ return &m_verts[0]; }
    sTri *TriData(){ return &m_tris[0]; }

};

#endif

3 个答案:

答案 0 :(得分:1)

正如其他人所提到的,此处需要进行解耦/重构 - stdafx.h并不意味着保存应用程序的所有头文件

您的问题是renderengine.h还包括stdafx.h。这次renderengine.h包含会因#pragma once而被忽略,而rmodel.h包含在renderengine.h的顶部。

您案件中最简单的事情是:

  • 删除renderengine.h&amp;来自rmodel.h
  • stdafx.h
  • rmodel.h包含renderengine.h
  • ... 已完成

答案 1 :(得分:0)

很难理解所有依赖项,我认为您的代码需要重构(如果不是重写)。此外,在没有任何架构构建体验的情况下(正如我所假设的)涌入渲染引擎开发通常会导致糟糕的不可靠代码,黑客“使其工作”和其他邪恶的东西。

无论如何,在这种情况下,尝试分解应用程序的部分并区分它们。在您的情况下,一种可能的方法意味着将所有渲染对象/结构(例如VertexLightModel放在另一个标题中(您可以将其称为render.types.h或{ {1}}或类似的东西)。

然后,您应该使用这些 渲染对象 简化渲染引擎。完成后,您将不需要render.objects.hstd::vector<RenderEngine::rDefaultVertex> m_verts;等语句。

请注意,这也可以解决您的循环依赖关系,因为您的引擎只需知道模型,模型 - 仅关于顶点等等。

如果您仍然面临依赖性问题,请使用前向声明。谷歌的完整描述,只是一个样本供你理解我的意思:

RenderEngine::cDefaultVertex *VertData()

答案 2 :(得分:0)

我无法确定,但RenderEngine.h可能包含rModel.h。然后当您加入stdafx.h时,它会引入RenderEngine.h,但在它完全处理该标题之前,它会包含rModel.h。然后在rModel.h内部,包含防护措施阻止它再次包含stdafx.h,并且在没有完全了解rModel.h中的任何内容的情况下继续编译RenderEngine.h

如果不了解各个班级的完整关系,很难提出修复建议。您很可能需要仔细考虑在哪些标头中定义哪些类,并使用前向声明来删除循环依赖项。