具有排序问题的结构的静态数据成员的命名空间

时间:2013-05-12 13:09:51

标签: c++ object c++11 namespaces static-members

我有以下代码,我遇到静态对象订单创建问题。

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

1 个答案:

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