我在头文件中声明了一个静态无序映射,如下所示:
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。我认为静态地图在程序中是持久的,所以我对我的静态地图如何空洞感到有些困惑。任何人都能解释一下吗?
由于
答案 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>
引入的所有依赖项纳入您程序的许多翻译单元吗?我可以继续这样做一段时间但重点是:将逻辑和数据包装到一个类中并通过接口提供服务。通过工厂或依赖容器创建接口实例,并明确管理该对象的生命周期。
此致
保