2012-08-15 86 views
4

這是第一次發佈,我是C++編程的初學者,主要是因爲我想知道它,因爲它總是很有趣,因爲它是如何工作的等等。
我試圖做一個簡單的遊戲,採用SFML 2.0,我的問題是:
我有一個枚舉,例如:
將枚舉傳遞給另一個文件? C++

enum GameState 
    { 
     Menu, 
     Battle, 
     Map, 
     SubMenu, 
     Typing 
    }; 

所以,我想做出那樣的變量,使用

​​

然後,將它傳遞給另一個文件,如

extern GameState State; 

,但我得到的錯誤

error: 'GameState' does not name a type 

如何枚舉傳遞到另一個文件?我試圖通過將其作爲main.cpp中的全局變量並將其包含在另一個文件的頭文件中來實現。

+1

請註明每個代碼塊在哪個文件中。 – 2012-08-15 13:03:21

+1

無論'extern'聲明是什麼,都必須能夠看到枚舉的聲明(因此它知道'GameState'的類型名稱)。通常情況下,這個聲明應該放在一個頭文件('.h'或'.hpp'文件)中,你可以'#include' – Useless 2012-08-15 13:04:37

+0

當你說'extern GameState State'傳遞給另一個文件時,源文件中的'extern GameState State'文件還是目標文件? – czchlong 2012-08-15 13:04:58

回答

7

您必須將枚舉放入頭文件中,並使用#include將它包含在源文件中。

事情是這樣的:

文件gamestate.h

// These two lines prevents the file from being included multiple 
// times in the same source file 
#ifndef GAMESTATE_H_ 
#define GAMESTATE_H_ 

enum GameState 
{ 
    Menu, 
    Battle, 
    Map, 
    SubMenu, 
    Typing 
}; 

// Declare (which is different from defining) a global variable, to be 
// visible by all who include this file. 
// The actual definition of the variable is in the gamestate.cpp file. 
extern GameState State; 

#endif // GAMESTATE_H_ 

文件gamestate.cpp

#include "gamestate.h" 

// Define (which is different from declaring) a global variable. 
GameState State = Menu; // State is `Menu` when program is started 

// Other variables and functions etc. 

文件main.cpp

#include <iostream> 
#include "gamestate.h" 

int main() 
{ 
    if (State == Menu) 
     std::cout << "State is Menu\n"; 
} 

現在全局變量State定義爲在文件gamestate.cpp中,但是可以在包含gamestate.h的所有源文件中引用,這要歸功於該文件中的extern聲明。更重要的是,枚舉類型GameState也是在源文件中包含gamestate.h時定義的,因此您沒有定義它的錯誤將會消失。

有關聲明和定義之間的區別,請參閱例如https://stackoverflow.com/a/1410632/440558

+0

謝謝,那個工作 – 2012-08-15 13:11:49

+0

+1也幫助我! – 2012-08-15 13:13:50

1

問題似乎是你已經定義了GameState在一個文件中的含義,但是2個文件需要知道定義。完成此操作的典型方法是創建一個包含頭文件(使用.h擴展名)(在兩個源代碼文件中使用#include)(很可能是.cpp),以便它們都出現在兩者中。這比複製和粘貼定義要好(要在其他地方使用它,只需要#include語句;如果定義更改,只需在.h文件中更改它,並且包含它的每個文件在重新編譯時都會得到更改) 。