我对编译器无法识别我的类的原因感到困惑。所以我只是告诉你我的代码并让你们决定。我的错误是这个
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
答案 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)
很难理解所有依赖项,我认为您的代码需要重构(如果不是重写)。此外,在没有任何架构构建体验的情况下(正如我所假设的)涌入渲染引擎开发通常会导致糟糕的不可靠代码,黑客“使其工作”和其他邪恶的东西。
无论如何,在这种情况下,尝试分解应用程序的部分并区分它们。在您的情况下,一种可能的方法意味着将所有渲染对象/结构(例如Vertex
,Light
,Model
放在另一个标题中(您可以将其称为render.types.h
或{ {1}}或类似的东西)。
然后,您应该使用这些 渲染对象 简化渲染引擎。完成后,您将不需要render.objects.h
或std::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
。
如果不了解各个班级的完整关系,很难提出修复建议。您很可能需要仔细考虑在哪些标头中定义哪些类,并使用前向声明来删除循环依赖项。