【发布时间】:2015-12-08 11:29:11
【问题描述】:
我需要在我的 .h 中初始化一个 static const std::list<std::string>。但是,我该怎么办?
class myClass {
static const std::list<std::string> myList = {"a", "b", "c"};
}
谢谢。
【问题讨论】:
我需要在我的 .h 中初始化一个 static const std::list<std::string>。但是,我该怎么办?
class myClass {
static const std::list<std::string> myList = {"a", "b", "c"};
}
谢谢。
【问题讨论】:
不,你不能直接这样做。
要在类定义中初始化一个 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?
【讨论】:
您不能在类内部初始化静态数据成员。 但是,您可以做的是像这样声明静态数据成员:
class myClass{
static const std::list<std::string> myList;
}
在你的类中的头文件中, 然后在其中一个实现文件中像这样初始化它:
const myClass::myList = std::list<std::string>({"a", "b", "c"});
希望这会有所帮助。
【讨论】:
使用 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
希望对你有帮助。
【讨论】:
可能是这样的(我最好重新考虑架构:))
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;
更多关于静态变量的信息在这个答案about static strings中。
【讨论】: