2010-05-24 87 views
1

我对编译器无法识别我的类感到困惑。所以我只是要告诉你我的代码,并让你们决定。我的错误是这样标题混淆。编译器无法识别数据类型

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 

回答

1

正如其他人所提到的,去耦/重构是为了在这里 - stdafx.h并不意味着持有所有头文件您的应用程序。

你的问题是,renderengine.h还包括stdafx.h。这次renderengine.h包括被忽略,因为#pragma oncermodel.h被包括在下 - 在renderengine.h的顶部。

你的情况最简单的事情将是:

  • 删除renderengine.h & rmodel.hstdafx.h
  • rmodel.h包括renderengine.h
  • ...
0

这是相当困难,了解你所有的依存关系,我认为你的代码需要重构(如果不重写)。另外,如果没有任何架构构建经验(如我所假设的),冲入渲染引擎开发通常会导致蹩脚的不可靠代码,黑客“使其工作”以及其他恶意内容。

无论如何,在这种情况下,尝试分解你的应用程序的部分并区分它们。在你的情况下,可能的方法之一将意味着把所有的渲染对象/结构,如Vertex,Light,Model在另一个头(你可以称之为render.types.hrender.objects.h或类似的东西)。

然后,你应该简单地使你的渲染引擎与这些渲染对象一起工作。一旦你完成了它,你将不需要像std::vector<RenderEngine::rDefaultVertex> m_verts;RenderEngine::cDefaultVertex *VertData()这样的陈述。

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

如果仍然面临依赖性问题,请使用前向声明。谷歌它充分说明,只是一个样本,为您明白我的意思:

class ForwardDeclared; 

class Object { 
    ForwardDeclared* member; 
    void Method(const ForwardDeclared& fd) { (...) } 
}; 

// This could also resude in another file 
class ForwardDeclared { (...) }; 
+0

好了,我的应用程序并不那么复杂。它只包含2个班级。 RenderEngine(带有rLight和rDefaultVertex)和rMdodel。这就对了。当然,还有WinMain文档,但也有stdafx头文件。简而言之,我所有的文档都有一个stdafx头文件。有没有直接的方式来看待这一点,并说什么是对的,什么是错的? – numerical25 2010-05-24 13:51:56

+0

启动一个'Empty Project',添加所有的头文件并去除预编译头文件'stdafx.h'。执行此操作后,解决文件问题将变成一项简单的任务。 – 2010-05-24 14:05:12

0

我不能告诉是肯定的,但RenderEngine.h可能包括rModel.h。然后,当您包含stdafx.h时,它会引入RenderEngine.h,但在它完全处理该标题之前,它将包含rModel.h。然后在rModel.h内包含防护再次包含stdafx.h,然后继续编译rModel.h而不知道RenderEngine.h中的任何内容。

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