我有一个包含静态成员的类,一个从字符串到函数指针的映射。此映射只需使用静态映射集填充一次,随后将不会进行修改。
我的问题是,如何确保地图在初始化之前不会被访问?我的代码目前看起来像这样:
class MyClass
{
static MapType s_myMap;
public:
static const MapType& getTheMap()
{
if (s_myMap.empty())
{
// Populate the map
}
return s_myMap;
}
};这对于MyClass的外部客户端工作得很好,但不会阻止内部类成员在private映射被初始化之前直接访问它。
为了解决这个问题,我正在考虑将map设置为getter方法的本地映射:
class MyClass
{
public:
static const MapType& getTheMap()
{
static MapType s_myMap;
if (s_myMap.empty())
{
// Populate the map
}
return s_myMap;
}
};这是一个好主意,还是有更好的方法来实现这一点?
发布于 2011-11-02 01:00:21
将静态变量移动到函数中将解决任何顺序的初始化问题,但它可能会给您留下一个破坏顺序。在许多情况下,最好使用指针和动态分配,这样映射就永远不会被破坏。
至于初始化它,我经常使用两个迭代器构造函数,这样我就可以使map本身成为const。为此,只需定义一个带有转换操作符的struct,如下所示:
struct MapInitData
{
char const* key; // Or whatever type is needed.
char const* value; // Or whatever type is needed.
operator MapType::value_type() const
{
return MapType::value_type( key, value );
}
};
MapInitData const mapInitTable[] =
{
{ "key1", "value1" },
// ...
};
MapType const ourMap( begin( mapInitTable ), end( mapInitTable ) );发布于 2011-11-02 00:31:47
您可以为此集合声明一个类,并将其填充到构造函数中。
发布于 2011-11-02 00:33:37
如果在global / namespace作用域中没有调用MyClass::getTheMap(),那么您不必担心static数据成员在初始化之前会被使用。
但是,如果在全局/ namespace作用域中使用上述static方法getTheMap():
SomeGlobal object = MyClass::getTheMap();那么你目前的方法看起来还不错。
https://stackoverflow.com/questions/7969583
复制相似问题