gpt4 book ai didi

c++静态变量初始化问题 - 引用另一个静态常量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:04 25 4
gpt4 key购买 nike

我试图在两个不同的 .cpp 中声明两个静态变量,一个试图在初始化期间使用另一个(例如 B 类 -> A 类)。如果我有包含 a.h 和 b.h 的 main.cpp,就可以编译代码。它在运行时崩溃(段错误(核心转储))。我知道这是静态变量初始化的问题,静态变量 A 可能在静态对象 B 的初始化期间尚未初始化。

请问什么是通过改变我的编码方式或任何设计模式来帮助解决此类问题的正确方法?

我看到一些帖子说在编译时使用“constexpr”来强制 A::a 初始化,我陷入了语法错误。

static constexpr std::string a;     // in a.h
constexpr std::string A::a="AAA"; // in a.cpp

错误:

a.h:7:34: error: constexpr static data member ‘a’ must have an initializer
static constexpr std::string a;

a.cpp:4:26: error: redeclaration ‘A::a’ differs in ‘constexpr’
constexpr std::string A::a="AAA";

完整代码如下:啊啊

#include <string>
using namespace std;

class A
{
public:
static const std::string a;
A();
~A();
};

a.cpp

#include "a.h"
using namespace std;

const std::string A::a("AAA");
A::A(){};
A::~A(){};

b.h

#include <string>
using namespace std;


class B
{
public:
B(const std::string& a );
~B();
};

b.cpp

#include "b.h"
#include "a.h"
#include <iostream>

static const B b(A::a);

B::B(const std::string& s){ cout <<"B obj::" << s << endl; };
B::~B(){};

我想过创建一个全局的getter函数

getA()
{
static std::string A::a; //hope that would force A::a initialization
return A::a;
}

然后

static B b(getA())

看起来很丑...

最佳答案

你被称为静态初始化顺序问题的问题。它被认为是一个“经典”问题。规避它的想法是手动管理“变量初始化的顺序。”

这是关于它的经典常见问题解答条目:https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use .

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com