c++ - 如何用另一个静态变量初始化一个静态变量?

标签 c++ global-variables static-variables

静态1.hpp

#include <string>
class Static1
{
    public:
        static const std::string my_string;
};

静态1.cpp

#include "Static1.hpp"
const std::string Static1::my_string = "aaa";

静态2.hpp

#include <string>
class Static2
{
    public:
        static const std::string my_string;
};

静态2.cpp

#include "Static2.hpp"
const std::string Static2::my_string = Static1::my_string;

主要.cpp

#include "Static2.hpp"
#include <iostream>

int main(argc int, char** argv)
{
     cout << to_string(Static2::my_string == "aaa") << endl;
     return 0;
}

如果我将 add_executable(printMyString main.cpp Static2.cpp Static1.cpp) 放入我的 CMakeLists.txt,我会得到

0

虽然 add_executable(printMyString main.cpp Static2.cpp Static1.cpp) 给我预期的行为

1

为了使我的代码更易于维护(这样我就不需要跟踪我列出源文件的顺序),有什么方法可以确保我得到 Static2::my_string == "aaa"?

最佳答案

您正在体验 static initialization order fiasco 的影响.

通常的解决方法是用范围内具有静态变量的函数替换您的静态变量,初始化并返回它。


这里是如何为你的例子完成的: Live Example (order1) <知识库> Live Example (order2)

class Static1
{
    public:
        static std::string my_string();
};

...

std::string Static1::my_string()
{
   static const std::string my_string = "aaa";
   return my_string;
}

...

class Static2
{
    public:
        static std::string my_string();
};

...

std::string Static2::my_string()
{
   static const std::string my_string = Static1::my_string();
   return my_string;
}

...

std::cout << std::to_string(Static2::my_string() == "aaa") << std::endl;

关于c++ - 如何用另一个静态变量初始化一个静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46562265/

相关文章:

c++ - 为什么这个静态 const int 成员变量似乎可以在数组定义中公开访问?

c++ - 10G这样的大数据文件如何处理?

python - 如何在使用静态类变量的类的 __init__ 中定义默认参数?

c++ - 无序映射初始化失败

c# - 如何从控制台应用程序中访问 Properties 命名空间?

android - 如何临时保存数据?比如安卓应用中的购物车

c# - 我成功解析了 URL,但无法将字符串变量传递给方法 C#

c - C中静态变量的初始化

c++ - cin.ignore 的 getline 问题

C++ MySQL++ 未定义对 dlclose 的引用