0

我有如下代码,我遇到了静态对象顺序创建问题。

h1.hpp

namespace X {

   struct XX {
        static const string str1;
        static const string str2;
   };
}

h1.cpp

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 程序段错误时。所以没有创建对象?

4

1 回答 1

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;
}
于 2013-05-12T13:15:15.350 回答