Initialize a static const list of strings
我需要在我的.h中初始化一个
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); |