初始化字符串的静态常量列表

Initialize a static const list of strings

本文关键字:常量 列表 静态 字符串 初始化      更新时间:2023-10-16

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

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

谢谢。

如何初始化my.h中的静态conststd::列表

不,你不能直接这么做。

要在类定义内初始化常量静态数据成员,它必须是整型(或枚举)类型;如果这样的对象只出现在积分常数表达式的位置,也是如此。有关更多详细信息,请参阅以下位置的C++11标准。

$9.4.2 Static data members and
$3.2 One Definition rule

但是,你可以做这样的事情:如何在头文件中定义const-static std::string?

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

我希望它能有所帮助。

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

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

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

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

希望这能有所帮助。

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

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

类静态变量可以在头中声明,但必须在实现文件中定义。这是因为静态变量的一个实例,而编译器无法在要放置哪个生成的对象文件,所以您必须做出决定通过在实现文件中定义变量。

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

关于静态变量的更多信息在这个关于静态字符串的答案中。