Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;:初始化静态字符串成员 我在C++中初始化静态字符串成员时遇到了一些问题。我有几个类,每个类都包含几个表示id的静态字符串成员。当我通过调用静态函数初始化变量时,一切正常。然而,当我想用另一个变量的值分配一个变量时,它仍然保持空字符串。这个代码有什么问题 std::string A::id() { std::stringstream sst; sst << "id" << i; i++; return sst.str(); } std::string B::str = A::id(); //prints "id0"; std::string C::str = "str"; //prints str std::string D::str = B::str; //prints "" <-- what's wrong here? std::string D::str2 = C::str; //prints "" std::string A::id() { std:stringstreamsst; sst_C++_String_Static - Fatal编程技术网

c++;:初始化静态字符串成员 我在C++中初始化静态字符串成员时遇到了一些问题。我有几个类,每个类都包含几个表示id的静态字符串成员。当我通过调用静态函数初始化变量时,一切正常。然而,当我想用另一个变量的值分配一个变量时,它仍然保持空字符串。这个代码有什么问题 std::string A::id() { std::stringstream sst; sst << "id" << i; i++; return sst.str(); } std::string B::str = A::id(); //prints "id0"; std::string C::str = "str"; //prints str std::string D::str = B::str; //prints "" <-- what's wrong here? std::string D::str2 = C::str; //prints "" std::string A::id() { std:stringstreamsst; sst

c++;:初始化静态字符串成员 我在C++中初始化静态字符串成员时遇到了一些问题。我有几个类,每个类都包含几个表示id的静态字符串成员。当我通过调用静态函数初始化变量时,一切正常。然而,当我想用另一个变量的值分配一个变量时,它仍然保持空字符串。这个代码有什么问题 std::string A::id() { std::stringstream sst; sst << "id" << i; i++; return sst.str(); } std::string B::str = A::id(); //prints "id0"; std::string C::str = "str"; //prints str std::string D::str = B::str; //prints "" <-- what's wrong here? std::string D::str2 = C::str; //prints "" std::string A::id() { std:stringstreamsst; sst,c++,string,static,C++,String,Static,这是 按照C++标准,如果在不同的 >/St>.中声明静态存储持续时间对象,则初始化顺序不指定。 P>因此,依赖于初始化此类对象的顺序的任何代码都注定失败,这个问题在C++中被称为静态初始化FasoS。 您的代码依赖于这样一个条件,即B::str和C::str的初始化发生在D::str之前,该标准不保证这一点。由于这3个静态存储持续时间对象驻留在不同的转换单元中,因此它们可以按任何顺序进行初始化 如何避免它? 解决方案是在首次使用时使用构造,简而言之,它意味着用一个全局函数替换全局对象,该函数

这是

按照C++标准,如果在不同的<强> >/St>.</P>中声明静态存储持续时间对象,则初始化顺序不指定。 <> P>因此,依赖于初始化此类对象的顺序的任何代码都注定失败,这个问题在C++中被称为<强>静态初始化FasoS。 您的代码依赖于这样一个条件,即

B::str
C::str
的初始化发生在
D::str
之前,该标准不保证这一点。由于这3个静态存储持续时间对象驻留在不同的转换单元中,因此它们可以按任何顺序进行初始化

如何避免它?

解决方案是在首次使用时使用构造,简而言之,它意味着用一个全局函数替换全局对象,该函数通过引用返回对象。通过引用返回的对象应该是局部静态的,因为静态局部对象是在控件第一次流过其声明时构造的,因此对象将仅在第一次调用和每次后续调用时创建相同的对象,从而模拟所需的行为


这应该是一本有趣的读物:



静态变量的初始化顺序没有保证,所以不要依赖它。
相反,使用实际的文本初始化它们,或者更好的是,在运行时在真正需要它们的时候初始化它们。

欢迎来到静态初始化地狱:-)您是从函数还是在任何块之外初始化属性?Google“静态初始化顺序失败”您在同一个cpp中显示的所有内容都是相同的吗?很好的链接,但是如果它总结了那里的信息,这将是一个更好的答案。@Markransem:Done。但是无论如何,C++常见问题解答的回答要漂亮得多。@Als谢谢!我用静态函数替换了它们,现在一切都好了working@Als,保存得很好。您现在有了我的+1。我同意C++常见问题解答回答了这个问题很好,但是有两个理由在这里有信息:第一是它给了你一个跟随链接的理由,第二是它保证了即使链接页面被更改或删除,答案仍然是有用的。+1最好在开始时就初始化它们,在你产生任何线程之前。