我的静态地图总是空的

时间:2011-03-26 09:24:52

标签: c++ c++11 unordered-map

我在头文件中声明了一个静态无序映射,如下所示:

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];

但地图始终为空。控制台的输出始终是初始化例程的4,然后是第二个cout的0。我认为静态地图在程序中是持久的,所以我对我的静态地图如何空洞感到有些困惑。任何人都能解释一下吗?

由于

2 个答案:

答案 0 :(得分:9)

当您在标头中声明变量时,每个编译单元(* .cpp)都会获得它自己的本地静态副本。你必须声明它extern

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

并在一个cpp中

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

答案 1 :(得分:1)

简单:只是不要这样做。虽然你可以摆脱@Eelke建议的初始化和范围,但你会长期射击自己...你真的想让每个人和所有地方都能访问哈希表吗?你真的接受无法控制访问(显然重要的)数据的风险吗?你真的想在整个应用程序中拥有一个不可测试的全局状态吗?您真的希望将<unordered_map>引入的所有依赖项纳入您程序的许多翻译单元吗?我可以继续这样做一段时间但重点是:将逻辑和数据包装到一个类中并通过接口提供服务。通过工厂或依赖容器创建接口实例,并明确管理该对象的生命周期。

此致