- 使用静态初始化顺序:
- 在C++中,全局变量的初始化顺序是未定义的,除非使用静态初始化顺序。一种常见的方法是将这些相关的全局变量定义在同一个源文件中,这样它们的初始化顺序就是按照定义的顺序进行。
- 例如:
// file1.cpp
#include <iostream>
int B = 10;
int A = B + 5;
int main() {
std::cout << "A: " << A << std::endl;
std::cout << "B: " << B << std::endl;
return 0;
}
- 使用函数内静态变量:
- 可以将全局变量的初始化封装到函数内的静态变量中。函数内的静态变量在第一次调用该函数时初始化,并且这种初始化是线程安全的(C++11起)。
- 例如:
// file1.cpp
#include <iostream>
int& getB() {
static int B = 10;
return B;
}
int& getA() {
static int A = getB() + 5;
return A;
}
int main() {
std::cout << "A: " << getA() << std::endl;
std::cout << "B: " << getB() << std::endl;
return 0;
}
- 使用单例模式(类似函数内静态变量思想):
- 对于复杂的对象,可以使用单例模式来管理全局对象的初始化。单例模式确保一个类只有一个实例,并提供一个全局访问点。
- 例如:
// file1.cpp
#include <iostream>
class B {
public:
static B& getInstance() {
static B instance;
return instance;
}
int value = 10;
private:
B() = default;
~B() = default;
B(const B&) = delete;
B& operator=(const B&) = delete;
};
class A {
public:
static A& getInstance() {
static A instance;
return instance;
}
int value = B::getInstance().value + 5;
private:
A() = default;
~A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
int main() {
std::cout << "A: " << A::getInstance().value << std::endl;
std::cout << "B: " << B::getInstance().value << std::endl;
return 0;
}