【问题标题】:why singleton design pattern allowing copy of object even copy constructor and assignment operator are private?为什么允许复制对象的单例设计模式甚至复制构造函数和赋值运算符都是私有的?
【发布时间】:2018-10-22 11:45:29
【问题描述】:

我在 singleton 类 下创建,并将复制构造函数和赋值运算符定义为私有。当我调用复制构造函数或赋值运算符时,它不会调用复制构造函数和赋值运算符(可能是由于静态对象创建)。所以我的问题是为什么单例设计模式允许创建对象的副本或分配新对象(这违反了创建类的单个实例化的基本要求)形式以前创建的对象,即使它们在类中被声明为私有?

请参考以下代码了解详情:-

#include <iostream>
#include "conio.h"
class singleton
{
static singleton *s;
          int i;

            singleton()
            {
            };          
            singleton(int x):i(x)
            { cout<<"\n Calling one argument constructor";
            };

            singleton(const singleton&)
            {
                cout<<"\n Private copy constructor";
            }

            singleton &operator=(singleton&)
            {
                cout<<"\n Private Assignment Operator";
            }

    public:
         static singleton *getInstance()
         {
            if(!s)
            {
                cout<<"\n New Object Created\n ";
                s=new singleton();
                return s;   
            }
             else
                {
                    cout<<"\n Using Old Object \n ";
                    return s;
                }

         }  
        int getValue()
        {
            cout<<"i = "<<i<<"\n";
            return i;
        }
        int setValue(int n)
        {
            i=n;
        }
};

singleton* singleton::s=0;

int main()
{
    // Creating first object

    singleton *s1=  singleton::getInstance();
    s1->getValue();

    singleton *s4=s1;    // Calling copy constructor-not invoking copy ctor
    singleton *s5;
    s5=s1;              // calling assignment operator-not invoking assign ope

    //Creating second object
    singleton *s2=singleton::getInstance();
    s2->setValue(32);
    s2->getValue();

    //Creating third object
    singleton *s3=singleton::getInstance();
    s3->setValue(42);
    s3->getValue();

    getch();
    return 0;
}

是我遗漏了什么还是我的理解有误。

请帮忙。 提前致谢。

【问题讨论】:

  • 你复制的是指针,而不是对象。
  • 如果构造函数是私有的,它甚至不允许单个对象
  • 不是这样,类本身(及其朋友)被允许访问私有方法和成员,这正是您在getInstance 中所做的。
  • 所以它将允许指针复制,以便我可以创建多个指向同一对象的指针。我的理解正确吗?
  • 感谢您的接受。并欢迎投票水平 ;-)

标签: c++11 singleton copy-constructor assignment-operator


【解决方案1】:

它总是 same 对象。您在这里使用指针来访问该单例!

这就像有 3 个鸡蛋盒,但只有一个鸡蛋,“随着时间的推移”放在不同的盒子里。这种比较并不完美,但希望足够接近。

【讨论】:

  • 你的意思是单例允许多个指针指向一个类的相同(单个)对象?。但据我了解,单例只允许一个类的单个实例化(单个指针)。
  • 指针不是实例化!一个指针指向一个实例。一个鸡蛋,三个盒子!但是只有一个鸡蛋!
  • 同意。在 getInstance() 中,我只创建一个对象,多个指针指向该对象。我现在明白构造函数需要是私有的,这样它就不允许在驱动程序(主)代码中创建对象。但是为什么我们需要赋值运算符私有呢?
  • 我们真的不需要它。但通常它是私有的,因为无论如何我们不需要它们公开。还要记住它是 C++,所以可能会写一些愚蠢的代码:singleton * sgl_ptr = static_cast&lt;singleton *&gt;(malloc(sizeof(singleton ))); *sgl_ptr = sgl;.