C++ 单例文件静态与类私有静态
对于以下定义单例的方法,有什么不同或具体的建议吗 在1中,singleton对象是一个类私有静态,但在2中,它是一个文件静态 注意:m_initedObj1只是用来显示类有state,用例是多次调用这个singleton->DoSomething(),而不需要再次初始化这个对象 (一) (二)C++ 单例文件静态与类私有静态,c++,C++,对于以下定义单例的方法,有什么不同或具体的建议吗 在1中,singleton对象是一个类私有静态,但在2中,它是一个文件静态 注意:m_initedObj1只是用来显示类有state,用例是多次调用这个singleton->DoSomething(),而不需要再次初始化这个对象 (一) (二) 也许这会让你更满意: class MyClass1 { private: MyClass1(){} public: MyClass1& Instance() {
也许这会让你更满意:
class MyClass1 {
private:
MyClass1(){}
public:
MyClass1& Instance() {
static MyClass1 theSingleInstance;
return theSingleInstance;
}
};
class MyClass2 {
private:
MyClass2() {}
public:
MyClass2* Instance() {
static MyClass2* theSingleInstance = new MyClass2;
return theSingleInstance;
}
};
class MyClass3 {
private:
MyClass3() {}
public:
MyClass3* Instance() {
static MyClass3 theSingleInstance;
return &theSingleInstance;
}
};
也许这会让你更满意:
class MyClass1 {
private:
MyClass1(){}
public:
MyClass1& Instance() {
static MyClass1 theSingleInstance;
return theSingleInstance;
}
};
class MyClass2 {
private:
MyClass2() {}
public:
MyClass2* Instance() {
static MyClass2* theSingleInstance = new MyClass2;
return theSingleInstance;
}
};
class MyClass3 {
private:
MyClass3() {}
public:
MyClass3* Instance() {
static MyClass3 theSingleInstance;
return &theSingleInstance;
}
};
在2)中,同一.cpp文件中的其他方法可以修改s_
另一方面,它们并非都是线程安全的。如果您真的不介意清除(显式调用ClearSingleton()),只需使用版本即可。否则,请使用该版本
如果显式删除,很难保证安全性。在访问它之前,您必须始终检查它是否已被删除。如果它是一个多线程的可执行文件,那么检查和使用它必须是原子的,因为它可以在检查之后被删除
双重检查锁定可用于创建和删除singleton,从而确保一次只有一个实例。但是,它不能确保对象确实存在,因为您可能会意外地删除它
您可以使用智能指针来计数引用,如果不存在引用,则可以将其删除
或者更好,看看这个答案
如果我是你,我就不会明确删除它 As,在2)相同.cpp文件中的其他方法可以修改s_
另一方面,它们并非都是线程安全的。如果您真的不介意清除(显式调用ClearSingleton()),只需使用版本即可。否则,请使用该版本
如果显式删除,很难保证安全性。在访问它之前,您必须始终检查它是否已被删除。如果它是一个多线程的可执行文件,那么检查和使用它必须是原子的,因为它可以在检查之后被删除
双重检查锁定可用于创建和删除singleton,从而确保一次只有一个实例。但是,它不能确保对象确实存在,因为您可能会意外地删除它
您可以使用智能指针来计数引用,如果不存在引用,则可以将其删除
或者更好,看看这个答案
如果我是你,我就不会明确删除它 在2)中,其他类方法可以修改s_foosingleton使用Scott Meyer的singleton。或者只是不使用singleton;-)@JerryGoyal是的,但是假设这个文件只有这个类,即使他们有,也不是什么大问题。@GuillaumeRacicot,是的,我知道启动C++11是线程安全的。但是对于上述情况,有什么区别吗?在2)其他类方法可以修改s_foosingleton使用Scott Meyer的singleton。或者只是不使用singleton;-)@JerryGoyal是的,但是假设这个文件只有这个类,即使他们有,也不是什么大问题。@GuillaumeRacicot,是的,我知道启动C++11是线程安全的。但是对于上述情况,有什么区别吗?公共实例函数应该是静态的,不是吗?公共实例函数应该是静态的,不是吗?如果你不介意清除,你是什么意思?这个单例函数不会被自己破坏吗?我指的是ClearSingleton()函数。它最终将被销毁,但我认为您希望显式调用ClearSingleton()函数,这使它变得更加困难。不,没关系。我可以删除该函数及其调用。谢谢只是好奇。。。如果需要,我如何按需销毁它?我尝试调用Foo::Singleton().~Foo(),它确实调用了析构函数,但之后,如果我调用Singleton(),相同的对象就在那里(并且可以工作),而没有再次调用构造函数(在函数中添加了一些打印来跟踪它)。如果您不介意清除,这是什么意思?这个单例函数不会被自己破坏吗?我指的是ClearSingleton()函数。它最终将被销毁,但我认为您希望显式调用ClearSingleton()函数,这使它变得更加困难。不,没关系。我可以删除该函数及其调用。谢谢只是好奇。。。如果需要,我如何按需销毁它?我尝试调用Foo::Singleton().~Foo(),它确实调用了析构函数,但之后,如果调用Singleton(),相同的对象就在那里(并且可以工作),而没有再次调用构造函数(在函数中添加了一些打印以跟踪此情况)。
class MyClass1 {
private:
MyClass1(){}
public:
MyClass1& Instance() {
static MyClass1 theSingleInstance;
return theSingleInstance;
}
};
class MyClass2 {
private:
MyClass2() {}
public:
MyClass2* Instance() {
static MyClass2* theSingleInstance = new MyClass2;
return theSingleInstance;
}
};
class MyClass3 {
private:
MyClass3() {}
public:
MyClass3* Instance() {
static MyClass3 theSingleInstance;
return &theSingleInstance;
}
};