在C++中使用静态变量时,通常会想要通过将一个变量传递给其构造函数来初始化另一个变量。换句话说,我想创建依赖于彼此的静态实例。
在单个.cpp或.h文件中,这不是问题:实例将按照声明的顺序创建。然而,当您想要使用另一个编译单元中的实例初始化静态实例时,似乎无法指定顺序。结果就是,取决于天气,可能会发生依赖于另一种实例的实例被构造,而仅在此之后才构造另一个实例。结果是第一个实例被错误地初始化。
有人知道如何确保静态对象按正确的顺序创建吗?我已经搜索了很长时间,尝试了所有方法(包括Schwarz计数器解决方案),但我开始怀疑是否真的有一种方法可以解决这个问题。
一个可能性是使用静态函数成员的技巧:
在单个.cpp或.h文件中,这不是问题:实例将按照声明的顺序创建。然而,当您想要使用另一个编译单元中的实例初始化静态实例时,似乎无法指定顺序。结果就是,取决于天气,可能会发生依赖于另一种实例的实例被构造,而仅在此之后才构造另一个实例。结果是第一个实例被错误地初始化。
有人知道如何确保静态对象按正确的顺序创建吗?我已经搜索了很长时间,尝试了所有方法(包括Schwarz计数器解决方案),但我开始怀疑是否真的有一种方法可以解决这个问题。
一个可能性是使用静态函数成员的技巧:
Type& globalObject()
{
static Type theOneAndOnlyInstance;
return theOneAndOnlyInstance;
}
确实,这样做是可以的。遗憾的是,您必须编写globalObject().MemberFunction()而不是globalObject.MemberFunction(),导致客户端代码有点混乱和不雅。
更新: 感谢您的回应。遗憾的是,看起来我确实已经回答了自己的问题。我想我必须学会接受它...