почему шаблон одноэлементного проектирования, позволяющий копировать объект, даже конструктор копирования и оператор присваивания являются закрытыми? - PullRequest
0 голосов
/ 12 мая 2018

Я создал ниже синглтон-класс и определил конструктор копирования и оператор присваивания как частный.Когда я вызываю конструктор копирования или оператор присваивания, он не вызывает конструктор копирования и оператор присваивания (возможно, из-за статического создания объекта).Поэтому мой вопрос заключается в том, почему шаблон одноэлементного проектирования позволяет создавать копию объекта или назначать новый объект (что нарушает базовое требование создания отдельного экземпляра класса) из ранее созданного объекта, даже если они объявлены закрытыми в классе?

Для подробностей рассмотрите приведенный ниже код: -

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

Я что-то упустил или мое понимание неверно.

Пожалуйста, помогите в этом.Заранее спасибо.

1 Ответ

0 голосов
/ 12 мая 2018

Это всегда один и тот же объект. Вы используете указатели для доступа к этому синглтону здесь!

Это похоже на 3 ящика для яиц, но только одно яйцо, которые «со временем» помещаются в разные ящики. Это сравнение не идеально, но, надеюсь, достаточно близко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...