2011-04-08 84 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