静态/全局对象的创建顺序
Creation order of static/global objects
在我的应用程序中,有两个全局对象。一个对象的构造函数——它访问另一个对象——假设它已经创建。幸运的是,我的应用程序在一段时间内运行正常。但是,由于cpp文件和编译顺序最近发生了变化,我发现全局对象的创建顺序与我的应用程序预期的不同。
所以,我的问题是,
是否有一种方法可以控制全局对象的创建顺序。我认为静态对象也应该有同样的问题。根据我的试用,我发现链接顺序或"o"文件会改变这一点。但这是正确的吗?难道没有合适的方法吗?
忽略全局变量不是一个好主意的事实,您可以将对象封装在函数中。通过这种方式,它们在第一次访问时被创建,让您可以控制创建顺序:
Foo& get_foo()
{
static Foo f;
return f;
};
Bar& get_bar()
{
static Bar b(get_foo());
return b;
}
使用示例:
int main() {
Bar& b = get_bar();
return 0;
}
一种很好的可维护方法是创建指向这些对象的全局指针,并按所需顺序在单个函数(如main((或其他地方(中分配它们。如果您改为进行"惰性评估",并简单地让对象在访问时创建,那么它们的顺序就不那么明显了,因此维护性也就降低了。
这当然意味着,如果指针没有初始化,那么它们将为空指针。
如果A的ctor必须使用对象B,那么A应该断言B不是null。
(编辑:这并不是说懒惰评估没有它的位置,但对于这种情况,我个人会使用指针(
查看Singleton模式(从yolinux复制(。有一些变体,但其想法是在通过Instance()
访问类的第一次使用时指定创建,然后用于访问代码中其他任何地方的类的唯一实例。
class Singleton{
public:
static Logger* Instance(){
if(!m_pInstance) return new Singleton;
return m_pInstance;
}
private:
Singleton(){}; // Private so that it can not be called
Singleton(Singleton const&){}; // copy constructor is private
Singleton& operator=(Singleton const&){}; // assignment operator is private
static Singleton* m_pInstance;
};
这部分应该在标题之外(最好在正文文件中(:
Singleton::Singleton* m_pInstance = NULL;
相关文章:
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 具有包含其他对象的类的对象创建顺序
- 如何创建线程序列以按照启动顺序执行任务?
- 如何创建跟踪以显示存在递归的调用顺序
- 我不知道如何创建一个以数字/字母顺序打印出我的整数或字符串的程序
- 创建按顺序索引的有序映射
- 虚拟基类的创建顺序
- 替换decorator模式以强制执行创建顺序
- 按执行顺序创建Pthread
- 创建顺序类对象
- 在同一优先级队列中创建递增和递减顺序选项
- C++和QML的对象顺序创建QT
- 对象创建和销毁顺序(按C++排列)
- 使用一个数组以相反的顺序创建另一个数组
- 原始数据包创建导致 IP 字段顺序不正确
- 为具有默认值的非顺序参数函数创建启动器
- 静态/全局对象的创建顺序
- 对象创建顺序,cpp
- 如何在c/c++中创建顺序的伪随机数
- Java/ c++对象创建顺序