0

在此,我试图将单例对象复制到另一个对象。虽然我已经覆盖了 = 运算符,但它给了我一些问题。请帮忙。

 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();
    }
4

2 回答 2

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
于 2012-04-09T09:53:39.553 回答
1

如果您阅读(并发布)编译器错误,它可能会有所帮助。我得到:

test.cpp:37: error: ‘singleTon::~singleTon()’ is private
test.cpp:55: error: within this context

其中第 37 行是私有析构函数的声明,第 55 行是_tmain代码尝试创建和销毁对象的点,需要一个公共析构函数。

如果您希望能够创建和销毁命名混乱的单例事物的多个副本,那么您需要公开析构函数。对于这个简单的示例,您可以通过完全删除析构函数来做到这一点;隐式构造函数将是公共的,并且没有需要非平凡破坏的成员。

于 2012-04-09T10:55:56.493 回答