Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++_Singleton - Fatal编程技术网

C++ 在函数中定义静态对象是否正确?

C++ 在函数中定义静态对象是否正确?,c++,singleton,C++,Singleton,如果多次调用getInstance函数,它是否总是返回相同的对象和所有obj1、obj2。。。obj1000将引用同一对象。是的,这是一种有效的方法,是的,所有objXXX将引用同一对象。第一次调用函数时将构造该对象。是的,这是一种有效的方法,是的,所有objXXX将引用同一个对象。第一次调用函数时将构造对象。是,但要注意线程问题。如果在启动将调用该方法的任何其他线程之前未调用getInstance,则此代码受争用条件的约束。是,但请注意线程问题。如果你在调用任何方法之前不调用GET实例,那么这

如果多次调用getInstance函数,它是否总是返回相同的对象和所有obj1、obj2。。。obj1000将引用同一对象。

是的,这是一种有效的方法,是的,所有objXXX将引用同一对象。第一次调用函数时将构造该对象。

是的,这是一种有效的方法,是的,所有objXXX将引用同一个对象。第一次调用函数时将构造对象。

是,但要注意线程问题。如果在启动将调用该方法的任何其他线程之前未调用getInstance,则此代码受争用条件的约束。

是,但请注意线程问题。如果你在调用任何方法之前不调用GET实例,那么这个代码就受种族条件的限制。

< P>技术上,这是合法的C++,你将得到相同的对象。它被称为单例反模式,应该像瘟疫一样避免,因为它会产生可怕的无法维护的软件。这是正确的方法吗?当然不是。

技术上讲,这是合法的C++,你将得到相同的对象。它被称为单例反模式,应该像瘟疫一样避免,因为它会产生可怕的无法维护的软件。这是正确的方法吗?绝对不会。

谢谢您的快速回复。但我有一个疑问。成员函数getInstance中作为内联函数的代码可以针对每次调用进行替换,并且可以替换多个实例created@sukumar:代码可能是内联的,这并不意味着变量将被复制。@Ernest Friedman Hill好的,您的意思是说如果getInstance是从不同的函数调用的,有机会创建多个object@sukumar:不,这不是一个风险。根据定义,忽略线程问题,将只创建一个对象,并且无论调用函数多少次以及从何处调用,它将只构造一次。但是,如果从多个线程调用该函数,则会得到未定义的行为,并且可以进行多次初始化。正如Dennis Zickefoose指出的,最新的C++标准最终也将保证线程安全。谢谢您的快速响应。但我有一个疑问。成员函数getInstance中作为内联函数的代码可以针对每次调用进行替换,并且可以替换多个实例created@sukumar:代码可能是内联的,这并不意味着变量将被复制。@Ernest Friedman Hill好的,您的意思是说如果getInstance是从不同的函数调用的,有机会创建多个object@sukumar:不,这不是一个风险。根据定义,忽略线程问题,将只创建一个对象,并且无论调用函数多少次以及从何处调用,它将只构造一次。但是,如果从多个线程调用该函数,则会得到未定义的行为,并且可以进行多次初始化。正如Dennis Zickefoose指出的,最新的C++标准最终也将保证线程安全。您能解释一下这个代码会如何产生可怕的不可维护性吗?software@sukumar:维护的一个重要方面是跟踪并最小化类之间的依赖关系;一个类的依赖性越多,也就是说,它与系统其余部分的耦合越紧密,修改它就越困难。使用显式依赖关系,并控制对象的创建方式以及谁可以访问它们,使它们易于跟踪。对全局对象的依赖性——无论你是否将它们装扮成单体——都很难跟踪,因为任何东西都可能依赖于它们。此外,在面向对象的设计中,你应该依赖于接口,而不是特定的实现。通过用存根实现替换依赖项,这使得隔离测试类变得更容易,包括测试它们是否与依赖类正确交互。如果依赖项是具有固定类型的全局对象,则无法执行此操作。话虽如此,在某些情况下,一个或两个对象实际上在任何地方都或多或少地被使用,并且使它们全局可访问可能是一个比向系统中的每个对象传递引用更干净的解决方案。只是不要经常这样做,也不要遵循经典的单例反模式来阻止多个实例。@Mike谢谢你的解释。你能解释一下这段代码如何产生可怕的不可维护性吗software@sukumar:维护的一个重要方面是跟踪并最小化类之间的依赖关系;一个类的依赖性越多,也就是说,它与系统其余部分的耦合越紧密,修改它就越困难。使用显式依赖关系,并控制对象的创建方式以及谁可以访问它们,使它们易于跟踪。对全局对象的依赖
无论她与否,你都很难将他们打扮成单身,因为任何东西都可能依赖于他们。此外,在面向对象的设计中,你应该依赖于接口,而不是特定的实现。通过用存根实现替换依赖项,这使得隔离测试类变得更容易,包括测试它们是否与依赖类正确交互。如果依赖项是具有固定类型的全局对象,则无法执行此操作。话虽如此,在某些情况下,一个或两个对象实际上在任何地方都或多或少地被使用,并且使它们全局可访问可能是一个比向系统中的每个对象传递引用更干净的解决方案。只是不要经常这样做,也不要遵循经典的单例反模式来防止多个实例。@Mike感谢您的解释
class MyClass {
public:
    static MyClass& getInstance() {
        static MyClass obj;
        return obj;
    }
};


int main()
{
    MyClass& obj1 = MyClass::getInstance();
    MyClass& obj2 = MyClass::getInstance();

        |
        |

    MyClass& obj1000 = MyClass::getInstance();  
}