【发布时间】:2011-11-01 16:27:30
【问题描述】:
我有一个类,它包含一个静态成员,一个字符串到函数指针的映射。此映射旨在使用一组静态映射填充一次,之后不会被修改。
我的问题是,如何确保地图在初始化之前不被访问?我的代码目前看起来像这样:
class MyClass
{
static MapType s_myMap;
public:
static const MapType& getTheMap()
{
if (s_myMap.empty())
{
// Populate the map
}
return s_myMap;
}
};
这对于MyClass 的外部客户端工作正常,但不会阻止内部类成员在初始化之前直接访问private 映射。
为了解决这个问题,我正在考虑将地图设置为 getter 方法的本地:
class MyClass
{
public:
static const MapType& getTheMap()
{
static MapType s_myMap;
if (s_myMap.empty())
{
// Populate the map
}
return s_myMap;
}
};
这是个好主意,还是有更好的方法来实现这一点?
【问题讨论】:
-
将静态元素移到函数中是个好主意。只要没有其他静态对象初始化调用
getTheMap,就可以了。 -
地图是动态初始化的吗?如果没有,您可以将其填充到初始化程序中(前提是您有最新的编译器)。
-
@KerrekSB 它是静态初始化的。只是为了检查我是否理解您,您是否建议将
// Populate the map隐含的代码移动到单独的初始化方法(例如initialiseMap()),然后通过MapType MyClass::s_myMap = initialiseMap()初始化地图? -
@atkins:我只会写
const MapType MyClass::s_myMap{ { 1, "Jim"}, { 2, "Jane" }, { 3, "Joseph" } };作为初始化器,没有单独的函数来执行填充。 -
@KerrekSB 唉,看来我的编译器不支持这种语法(我们被困在 MSVC 2003 上)。我得到
error C2470: 'MyClass::s_myMap' : looks like a function definition, but there is no formal parameter list; skipping apparent body。不过感谢您的想法!
标签: c++ initialization static-members