这个单例对象创建代码有什么错误

时间:2012-04-09 09:45:25

标签: c++ class singleton

在此,我试图将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();
    }

2 个答案:

答案 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中代码尝试创建和销毁对象的点,需要公共析构函数。

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