2011-04-08 63 views
2

我有一个完全实现的State类,如下所述。我还有一个继承State类的PlayState类,它也被完全实现。我的编译错误是 “playstate.h(6):错误C2504: '国家':基类未定义” 我在Global.h检查它们的顺序,State.h出现PlayState.h继承错误“Base Class Unidentified”

CODE:
STATE.H

#pragma once 

    #include "Global.h" 

class State 
{ 
    public: 
State(void); 
virtual ~State(void); 

virtual void Input(INPUTDATA* InputData); 
virtual void Logic(OBJECT go[], INPUTDATA* InputData); 
virtual void Render(OBJECT go[]); 
virtual void InitGame(OBJECT go[]); 
virtual void LoadGraphics(void); 

void Toggle(); 
bool IsEnabled(); 

    private: 
bool isEnabled; 

}; 

PlayState.h

#include "Global.h" 

class PlayState : public State 
{ 
    private: 
#define UPDATESPEED 1000 // milliseconds between each update 

// global variables 
float camXAngle; 
float camYAngle; 
float camZoom; 
int updatetime; 
bool gameover; 
float runspeed; 
D3DLIGHT9 light; 

SPRITE graphics; 
SPRITE particleTexture; 
MODEL terrain[2]; 
MODEL sky; 

public: 
PlayState(); 
~PlayState(); 

void Input(INPUTDATA* InputData); 
void Logic(OBJECT go[], INPUTDATA* InputData); 
void Render(OBJECT go[]); 
void InitGame(OBJECT go[]); 
void LoadGraphics(void); 
}; 

感谢

+0

@ user692270:你能显示你的'Global.h'看起来像什么吗? – 2011-04-08 09:38:49

+0

你的意思是你在“Global.h”中包含“PlayState.h”,同时包含“Global.h”到“PlayState.h”? – 2011-04-08 09:42:43

+0

@ user692270:对。你必须显示“Global.h”内容和你编译的* .cpp文件内容。 – 2011-04-08 09:45:42

回答

4

如果某些* .cpp包含“State.h”而没有在其之前的某处存在“Global.h”,那么您将会发布您发布的错误。

因为当“State.h”包括“Global.h”,那么“Global.h”不包括“State.h”(因为#pragma once),但它包含“PlayState.h”,所以最后你有定义了class State之前包含的“PlayState.h”。

只是不要做出这种怪异的圆形包裹。

0
#pragma once 

#include "Global.h" 

class PlayState : public State 

什么是“国家”?这正是编译器所抱怨的。

您不能继承尚未完全定义的类。查看PlayState.h文件,你无处指定State类。

更正后的代码:

#pragma once 

#include "State.h" 
class PlayState : public State 
+0

虽然未包含在原始问题代码中,但user692270似乎在'global.h'中声明,它包含State.h和PlayState.h,按正确顺序。为什么它会再次包含在PlayState.h中?它受到编译指示的影响吗? – forsvarir 2011-04-08 09:37:34

+1

-1他的'Global.h'定义'State'。 – 2011-04-08 09:42:36

+0

在这种情况下,您更正的代码不会纠正任何问题。你仍然会有同样的错误。 – 2011-04-08 10:06:42

1

如果您Global.h已经包括State.hPlayState.h,并在State.hPlayState.h前下订单,那么没有理由得到特殊的错误(你的源代码张贴),除非你正在做一些愚蠢的错字,比如在状态中错过了一个上限。请检查错误!或者可能有另一个原因来解决问题。

您正在构建includes的循环依赖项,应该避免这种依赖项。
一个简单的解决方案可能不包括State.hPlayState.hGlobal.h。 只需包含State.h里面PlayState.h它应该没问题。 Global.h不会以这种方式建立任何循环依赖关系。

+0

“这里没有理由得到错误”不正确。如果某些* .cpp包含“State.h”而没有“Global”。h“之前的某个地方,那么你将会得到与海报完全相同的错误。 – 2011-04-08 09:58:09

+0

@Serge Dundich:没错,我应该在OP发布的源代码中说,我会做出修改,尽管编辑后的建议可能会解决他的问题。 – 2011-04-08 10:03:37

+0

是的,圆形内含物是不可避免的。 – 2011-04-08 10:10:16