初始化一个静态const字符串列表

时间:2015-12-08 11:29:12

标签: c++ list static const

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

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

感谢。

5 个答案:

答案 0 :(得分:4)

如何在我的.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?

答案 1 :(得分:2)

您无法在类内部初始化静态数据成员。 但是,您可以做的是声明静态数据成员,如下所示:

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

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

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

希望这有帮助。

答案 2 :(得分:1)

使用c ++ 11,您可以使用&#34;初始化第一个呼叫&#34;正如@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

我希望它有所帮助。

答案 3 :(得分:0)

也许这样的事情(我最好重新考虑这个架构:))

{{1}}

答案 4 :(得分:0)

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

使用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