【问题标题】:Initialize a static const list of strings初始化字符串的静态 const 列表
【发布时间】:2015-12-08 11:29:11
【问题描述】:

我需要在我的 .h 中初始化一个 static const std::list<std::string>。但是,我该怎么办?

class myClass {
    static const std::list<std::string> myList = {"a", "b", "c"};
}

谢谢。

【问题讨论】:

    标签: c++ list static constants


    【解决方案1】:

    如何在我的 .h 中初始化静态 const std::list?

    不,你不能直接这样做。

    要在类定义中初始化一个 const 静态数据成员,它必须是整数(或枚举)类型;如果这样的对象只出现在整数常量表达式的位置,也是如此。 更多详情,请在以下地方参考C++11 standard

    $9.4.2 Static data members and
    $3.2 One Definition rule
    

    但是,您可以执行以下操作: How can you define const static std::string in header file?

    【讨论】:

      【解决方案2】:

      您不能在类内部初始化静态数据成员。 但是,您可以做的是像这样声明静态数据成员:

      class myClass{
          static const std::list<std::string> myList;
      }
      

      在你的类中的头文件中, 然后在其中一个实现文件中像这样初始化它:

      const myClass::myList = std::list<std::string>({"a", "b", "c"});
      

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        使用 c++11,您可以按照@smRaj 指出的答案中的建议使用“第一次调用的初始化”习语:

        class myClass {
         public:
          // The idiomatic way:
          static std::list<std::string>& myList() {
            // This line will execute only on the first execution of this function:
            static std::list<std::string> str_list = {"a", "b", "c"};
            return str_list;
          }
        
          // The shorter way (for const attributes):
          static const std::list<std::string> myList2() { return {"a", "b", "c"}; }
        };
        

        然后像往常一样访问它,但在其后添加()

        int main() {
          for(std::string s : myClass::myList())
            std::cout << s << std::endl;
        }
        

        输出:

        a
        b
        c
        

        希望对你有帮助。

        【讨论】:

          【解决方案4】:

          可能是这样的(我最好重新考虑架构:))

          static std::string tmp[] = { "a", "b", "c" };
          static std::list<std::string> myList(tmp, tmp + 2);
          

          【讨论】:

            【解决方案5】:

            类静态变量可以在标题中声明,但必须是 定义在一个实现文件中。这是因为只能有 静态变量的一个实例,编译器无法决定 哪个生成的目标文件放置它,所以你必须做出决定 通过在实现文件中定义变量。

            使用 C++11 中的声明保留静态值的定义 可以使用嵌套的静态结构。在这种情况下,静态成员 是一个结构,必须在 .cpp 文件中定义,但值 在标题中。

            class myClass
            {
            public:
              static struct _Globals {
                 const std::list<std::string> myList = {"a", "b", "c"}
              } g;
            };
            

            整个静态结构不是初始化单个成员,而是在 .cpp 中初始化:

            myClass::_Globals myClass::g;
            

            通过

            访问这些值
            myClass::g.myList;
            

            更多关于静态变量的信息在这个答案about static strings中。

            【讨论】:

              猜你喜欢
              • 2011-09-26
              • 2014-12-14
              • 1970-01-01
              • 2010-11-25
              • 2011-04-18
              • 1970-01-01
              • 1970-01-01
              • 2012-12-15
              • 1970-01-01
              相关资源
              最近更新 更多