首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制静态成员初始化

强制静态成员初始化
EN

Stack Overflow用户
提问于 2011-11-02 00:27:31
回答 4查看 306关注 0票数 2

我有一个包含静态成员的类,一个从字符串到函数指针的映射。此映射只需使用静态映射集填充一次,随后将不会进行修改。

我的问题是,如何确保地图在初始化之前不会被访问?我的代码目前看起来像这样:

代码语言:javascript
复制
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方法的本地映射:

代码语言:javascript
复制
class MyClass
{
public:
  static const MapType& getTheMap()
  {
    static MapType s_myMap;
    if (s_myMap.empty())
    {
      // Populate the map
    }
    return s_myMap;
  }
};

这是一个好主意,还是有更好的方法来实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-02 01:00:21

将静态变量移动到函数中将解决任何顺序的初始化问题,但它可能会给您留下一个破坏顺序。在许多情况下,最好使用指针和动态分配,这样映射就永远不会被破坏。

至于初始化它,我经常使用两个迭代器构造函数,这样我就可以使map本身成为const。为此,只需定义一个带有转换操作符的struct,如下所示:

代码语言:javascript
复制
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 ) );
票数 1
EN

Stack Overflow用户

发布于 2011-11-02 00:31:47

您可以为此集合声明一个类,并将其填充到构造函数中。

票数 1
EN

Stack Overflow用户

发布于 2011-11-02 00:33:37

如果在global / namespace作用域中没有调用MyClass::getTheMap(),那么您不必担心static数据成员在初始化之前会被使用。

但是,如果在全局/ namespace作用域中使用上述static方法getTheMap()

代码语言:javascript
复制
SomeGlobal object = MyClass::getTheMap();

那么你目前的方法看起来还不错。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7969583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档