C++11 为什么允许复制对象甚至复制构造函数和赋值运算符的单例设计模式是私有的?
我在下面创建了单例类,并将复制构造函数和赋值运算符定义为私有类。当我调用复制构造函数或赋值运算符时,它不会调用复制构造函数和赋值运算符(可能是由于静态对象创建)。所以我的问题是,为什么单例设计模式允许创建对象的副本或从以前创建的对象中分配新对象(这违反了创建类的单个实例化的基本要求),即使它们在类中声明为私有 有关详细信息,请考虑以下代码:-C++11 为什么允许复制对象甚至复制构造函数和赋值运算符的单例设计模式是私有的?,c++11,singleton,copy-constructor,assignment-operator,C++11,Singleton,Copy Constructor,Assignment Operator,我在下面创建了单例类,并将复制构造函数和赋值运算符定义为私有类。当我调用复制构造函数或赋值运算符时,它不会调用复制构造函数和赋值运算符(可能是由于静态对象创建)。所以我的问题是,为什么单例设计模式允许创建对象的副本或从以前创建的对象中分配新对象(这违反了创建类的单个实例化的基本要求),即使它们在类中声明为私有 有关详细信息,请考虑以下代码:- #include <iostream> #include "conio.h" class singleton { static singlet
#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;
}
#包括
#包括“conio.h”
单件阶级
{
静态单态*s;
int i;
singleton()
{
};
单态(int x):i(x)
{cout它始终是同一个对象。您正在使用指针访问此单例
这就像有3个鸡蛋盒,但只有一个鸡蛋,“随着时间的推移”放在不同的盒子里。这种比较并不完美,但希望足够接近。你复制的是指针,而不是对象。如果构造函数是私有的,它甚至不允许单个不正确的对象,比如类本身(及其朋友)允许访问私有方法和成员,这正是您在getInstance
中所做的。因此它将允许指针复制,以便我可以创建指向同一对象的多个指针。我的理解正确吗?我感谢接受。欢迎使用upvote级别;-)您的意思是singleton允许多个指针指向同一对象(单个)类的对象?。但根据我的理解,singleton只允许类的单个实例化(单个指针)。指针不是实例化!指针指向实例。一个鸡蛋,三个盒子!但只有一个鸡蛋!同意。在getInstance()中我只创建了一个对象,多个指针指向它。我现在明白了构造函数需要是私有的,这样它就不允许在驱动程序(main)中创建对象代码。但是为什么我们需要分配操作员私有?我们并不需要它。但是通常它是私有的,因为我们不需要它公开。也请记住它是C++,因此可以编写一些愚蠢的代码:<代码> Stutelon *sGLYPPT= STATICORCAST CAST(Malc(SIZEOF(SUNLITON)));*SGLYPPTR = SGL;< /C>。