6

我使用 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};

有没有办法在没有中间变量的情况下做到这一点?

4

2 回答 2

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};

这是一个活生生的例子

正如 Praetorian 在评论中所建议的那样,如果您可以明确指定容器的大小并且在运行时不需要更改大小,则您可能需要替换std::vector为:std::array

#include <array>

struct Settings{
    const std::string name;
    const std::array<std::string, 3> A;
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^
    const size_t a;
};

这是一个活生生的例子

于 2013-05-21T18:31:00.977 回答
5

那是因为您存储的是指向字符串数组的指针,而不是字符串本身;所以你需要一个字符串数组指向某个地方。您所拥有的只是一个包含指向字符数组的指针的大括号初始化器。

如果您要自己存储字符串(vector<string>例如,在 a 中),那么第一个版本就可以工作。

于 2013-05-21T18:32:13.113 回答