我需要在我的.h中初始化static const std::list<std::string>
。但是,我该怎么做?
class myClass {
static const std::list<std::string> myList = {"a", "b", "c"};
}
感谢。
答案 0 :(得分:4)
不,你不能直接这样做。
要在类定义中初始化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。