在此,我试图将singleton对象复制到另一个对象。虽然我有覆盖=运算符,它给我一些问题。请帮助。
class singleTon
{
public:
static singleTon* InitInstance()
{
if(singleTonObjPtr== NULL)
{
singleTonObjPtr = new singleTon;
}
return singleTonObjPtr;
}
singleTon* getObject()
{
return singleTonObjPtr;
}
singleTon(const singleTon& singletonObj)
{
}
void operator =(const singleTon& singletonObj)
{
return;
}
private:
singleTon()
{
i = 50;
singleTonObjPtr = NULL;
}
~singleTon()
{
}
int i;
static singleTon* singleTonObjPtr;
};
singleTon* singleTon::singleTonObjPtr = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
singleTon *singleTOnPtr =NULL;
singleTOnPtr = singleTon::InitInstance();
singleTon *singleTOnPtr2 = singleTOnPtr->getObject();
singleTon obj3 = *singleTon::InitInstance();
}
答案 0 :(得分:2)
首先,operator =是赋值运算符,因此您要分配而不是复制。您的赋值运算符返回void
,但它应返回singleTon&
。但你真的要问一下分配给单身人士的意义是什么。例如:
singleTon a = singleTon::InitInstance(); // single instance
singleTon b = singleTon::InitInstance(); // same instance
a = b; // assignment, but a and b really are the same instance, so what's the point?
而且,对于单身人士,不应该有默认构造:
singleTon b; // this should not be allowed
b = a; // so this makes no sense
答案 1 :(得分:1)
如果您阅读(并发布)编译器错误,它可能会有所帮助。我明白了:
test.cpp:37: error: ‘singleTon::~singleTon()’ is private
test.cpp:55: error: within this context
其中第37行是私有析构函数的声明,第55行是_tmain
中代码尝试创建和销毁对象的点,需要公共析构函数。
如果您希望能够创建和销毁混淆命名 - 不完全单例的东西的多个副本,那么您需要将析构函数公开。对于这个简单的例子,你可以通过完全删除析构函数来做到这一点;隐式构造函数将是公共的,并且没有需要非平凡破坏的成员。