我使用C ++ 11并且有一个包含以下结构的类:
struct Settings{
const std::string name;
const std::string* A;
const size_t a;
};
class X {
static const Settings s;
//More stuff
};
在.cpp
文件中,我想像这样定义它
X::s = {"MyName", {"one","two","three"}, 3};
但这不起作用。但是它确实可以使用中间变量
const std::string inter[] = {"one","two","three"};
X::s = {"MyName", inter, 3};
有没有办法在没有中间变量的情况下做到这一点?
答案 0 :(得分:5)
无法从值列表初始化指针。您可以改为使用std::vector
:
#include <vector>
struct Settings{
const std::string name;
const std::vector<std::string> A;
// ^^^^^^^^^^^^^^^^^^^^^^^^
const size_t a;
};
然后你可以写:
class X {
static const Settings s;
//More stuff
};
const Settings X::s = {"MyName", {"one","two","three"}, 3};
这是live example。
As suggested by Praetorian in the comments,您可能希望将std::vector
替换为std::array
,如果您可以明确指定容器的大小,并且大小不需要更改在运行时:
#include <array>
struct Settings{
const std::string name;
const std::array<std::string, 3> A;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
const size_t a;
};
这是live example。
答案 1 :(得分:5)
那是因为你要存储一个指向字符串数组的指针,而不是字符串本身;所以你需要一个指向某个地方的字符串数组。你所拥有的只是一个包含指向字符数组指针的大括号初始化器。
如果您要自己存储字符串(例如,在vector<string>
中),那么第一个版本就可以工作。