关于c ++:初始化字符串的静态const列表

Initialize a static const list of strings

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

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

谢谢。


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

不,你不能直接这么做。

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

1
2
$9.4.2 Static data members and
$3.2 One Definition rule

但是,您可以这样做:如何在头文件中定义const static std::string?


无法初始化类内的静态数据成员。但是,您可以这样声明静态数据成员:

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

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

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

希望这有帮助。


使用C++ 11,可以使用"第一调用初始化"成语,如"SMRAJ"所指出的答案:

1
2
3
4
5
6
7
8
9
10
11
12
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"}; }
};

然后像通常那样访问它,但在它之后添加一个()

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

输出:

1
2
3
a
b
c

希望有帮助。


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

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

1
2
3
4
5
6
7
class myClass
{
public:
  static struct _Globals {
     const std::list<std::string> myList = {"a","b","c"}
  } g;
};

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

1
myClass::_Globals myClass::g;

使用访问值

1
myClass::g.myList;

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


也许是这样的(我最好重新考虑一下建筑:)

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