Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单例文件静态与类私有静态_C++ - Fatal编程技术网

C++ 单例文件静态与类私有静态

C++ 单例文件静态与类私有静态,c++,C++,对于以下定义单例的方法,有什么不同或具体的建议吗 在1中,singleton对象是一个类私有静态,但在2中,它是一个文件静态 注意:m_initedObj1只是用来显示类有state,用例是多次调用这个singleton->DoSomething(),而不需要再次初始化这个对象 (一) (二) 也许这会让你更满意: class MyClass1 { private: MyClass1(){} public: MyClass1& Instance() {

对于以下定义单例的方法,有什么不同或具体的建议吗

在1中,singleton对象是一个类私有静态,但在2中,它是一个文件静态

注意:m_initedObj1只是用来显示类有state,用例是多次调用这个singleton->DoSomething(),而不需要再次初始化这个对象

(一)

(二)


也许这会让你更满意:

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;
    }
};