2011-03-26 21 views
2

我聲明在頭文件中的靜態無序圖如下:我的靜態地圖總是空

static boost::unordered_map<KeyAction, sf::Key::Code> WindowKeyMap; 
在同一頭文件

,我有填充了一些值映射函數:

static void Initialize(std::string &file) 
{ 
    WindowKeyMap[MoveLeft] = sf::Key::Code::Left; 
    WindowKeyMap[MoveRight] = sf::Key::Code::Right; 
    WindowKeyMap[MoveUp] = sf::Key::Code::Up; 
    WindowKeyMap[MoveDown] = sf::Key::Code::Down; 
    std::cout << std::endl << WindowKeyMap.size() << std::endl; 
} 
在我的計劃後來

,一個單獨的類/函數裏面,我嘗試讀取值之一:

std::cout << std::endl << WindowKeyMap.size() << std::endl; 
auto test2 = WindowKeyMap[MoveRight]; 

但第m ap總是空的。控制檯的輸出始終是初始化例程的4,然後是第二個cout的0。我認爲靜態地圖在整個程序中是持久的,所以我對於我的靜態地圖是如何變爲空的有點困惑。任何人都可以點亮一下嗎?

感謝

+2

我的是半滿的! ;) – 2011-03-26 09:26:25

+2

你真的調用'Initialize' ... – 2011-03-26 09:28:53

回答

9

當你聲明的變量一樣,每個編譯單元(*的.cpp)得到它的自己的本地靜態副本標題。您必須聲明它extern

extern boost::unordered_map<KeyAction, sf::Key::Code> WindowKeyMap; 

和一個CPP把

boost::unordered_map<KeyAction, sf::Key::Code> WindowKeyMap; 
+1

[這個問題]的答案(http://stackoverflow.com/questions/1358400/)更詳細地解釋它。 – 2011-03-26 09:33:00

1

簡單:就是不去做。儘管您可以像@Eelke所建議的那樣去除初始化和範圍,但是您會長期投入自己的腳步......您是否真的希望每個人都可以訪問哈希表?你真的接受無法控制訪問(顯然很重要)數據的風險嗎?你真的想在你的應用程序中擁有一個不可測試的全局狀態嗎?你真的想把<unordered_map>引入的所有依賴關係拉入你的程序的許多翻譯單元嗎?我可以繼續這樣一段時間,但重點是:將邏輯和數據封裝到一個類中,並通過接口提供服務。通過工廠或依賴容器創建接口實例,並顯式管理該對象的生命週期。

問候,

保羅