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 に答える