我有以下代码,我遇到静态对象订单创建问题。
namespace X {
struct XX {
static const string str1;
static const string str2;
};
}
namespace X {
const string XX::str1 = "Hello World";
const string XX:str2 = "Hello Country";
}
h2.cpp ----> included h1.hpp
h3.cpp ----> included h1.hpp
h4.cpp ----> included h1.hpp
------
我想以[X :: XX :: str1]
的形式访问它func1(X::XX::str1); etc.
什么是最好的方法,因为上面给出了一些静态对象创建顺序问题,当我尝试访问X :: XX :: str1时,我得到空而不是" Hello World"。如何确保使用相同的对象(X :: XX:str1)而不是每个创建本地副本的位置。
实际上当我访问X :: XX :: str1程序时段错误。所以没有创建对象?
答案 0 :(得分:1)
这应该有效。如果从另一个静态对象的构造函数中调用func1
,则只能存在静态顺序初始化问题。
如果是这种情况,您可以访问XX
中的静态变量,通过返回对函数本地静态变量的引用的静态成员函数。调用该函数将保证对象被初始化。
#include <iostream>
#include <string>
struct XX {
static std::string& str1()
{ static std::string x = "Hello World"; return x; }
static std::string& str2()
{ static std::string x = "Hello Country"; return x; }
};
int main()
{
std::string& x = XX::str1();
std::cout << x << std::endl;
std::cout << XX::str2() << std::endl;
return 0;
}