初始化一个静态的常量字符串列表

3

我需要在我的 .h 文件中初始化一个 static const std::list<std::string>。但是,我该怎么做呢?

class myClass {
    static const std::list<std::string> myList = {"a", "b", "c"};
}

谢谢。
5个回答

4

我该如何在我的.h文件中初始化一个静态的const std::list?

抱歉,您不能直接这样做。

要在类定义内部初始化const static数据成员,它必须是整数(或枚举)类型;并且如果此对象仅出现在整数常量表达式的位置,则也必须是如此。 有关更多详细信息,请参见C++11标准中的以下内容。

$9.4.2 Static data members and
$3.2 One Definition rule

但是,你可能可以像这样做: 如何在头文件中定义常量静态字符串?

3

使用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

我希望这能有所帮助。

2
你不能在类内部初始化静态数据成员。 然而,你可以像这样声明静态数据成员:
class myClass{
    static const std::list<std::string> myList;
}

在头文件中定义你的类,然后在其中声明一个变量,在实现文件中进行初始化:

const myClass::myList = std::list<std::string>({"a", "b", "c"});

希望这能帮到你。

0
可能是这样的(我最好重新考虑架构:))
static std::string tmp[] = { "a", "b", "c" };
static std::list<std::string> myList(tmp, tmp + 2);

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;

关于静态变量的更多信息可以在这个答案中找到关于静态字符串的内容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接