【问题标题】:Initialize static std::multimap inside method where it is declared在声明它的方法内初始化静态 std::multimap
【发布时间】:2012-12-19 17:20:27
【问题描述】:

我需要静态多图,但我不想将它作为类字段,因为我只需要一种方法。我是这样写的,但是在函数内部初始化这个映射是否有任何其他方式,初始化代码只会在第一次调用函数时运行?

static void someClass::someMethod(/**/)
{
    static multimap<int, char> err;

    if(err.size() == 0)
    {//initialize here
        err.insert(std::pair<int, char>(1, 'a'));
        err.insert(std::pair<int, char>(2, 'b'));
        err.insert(std::pair<int, char>(3, 'v'));
        err.insert(std::pair<int, char>(4, 'c'));
    }
    //method logic
}

【问题讨论】:

  • 也许这与您的情况无关,但请记住此代码不是线程安全的
  • @LucaMartini 是的,我知道,但在我的情况下没关系。那么这种方式可以吗?我认为一定有更优雅的东西
  • 如何将 multimap 包装在一个类中并为它定义一个构造函数来获取对列表?这样它只会被构造一次,在这种情况下你不需要 if 语句......唯一的问题是你创建了一个你扔掉的对列表,但无论如何你都会这样做。而且您需要在包装类中提供对地图的访问功能。

标签: c++ static initialization


【解决方案1】:

如果你有 C++11 编译器,你可以使用初始化列表:

static std::multimap<int, char> err = {
    { 1, 'a' },
    { 2, 'b' },
    { 3, 'v' },
    { 4, 'c' }
};

【讨论】:

    【解决方案2】:

    编写一个返回填充的multimap 的函数并调用该函数:

    multimap<int, char> create_err()
    {
        multimap<int, char> err;
        err.insert(std::pair<int, char>(1, 'a'));
        err.insert(std::pair<int, char>(2, 'b'));
        err.insert(std::pair<int, char>(3, 'v'));
        err.insert(std::pair<int, char>(4, 'c'));
        return err;
    }
    
    static void someClass::someMethod(/**/)
    {
        static multimap<int, char> err = create_err();
        //method logic
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      相关资源
      最近更新 更多