3

シングルトン デザイン パターンの使い方を学んでいます。簡単なコードを書き、コンストラクターのオーバーロードと、ポインターを削除する終了関数を含めました。問題は、コンストラクターのオーバーロードが機能せず、2 つのパラメーターを必要としないことです。理由がわからない?

//header============================================
#include <iostream>
using namespace std;

class singleton
{
public:
        static singleton* getInstance();
        static singleton* getInstance(int wIn,int lIn);
        static void terminate();// memmory management
        int getArea();// just to test the output


private:
        static bool flag;
        singleton(int wIn, int lIn);
        singleton();
        static singleton* single;
        int width,len;
};

//implement=============================
#include "singleton.h"
#include <iostream>

using namespace std;

int singleton::getArea(){
        return width*len;
}
singleton* singleton::getInstance(int wIn,int lIn){

        if (!flag)
        {
                single= new singleton(wIn,lIn);
                flag= true;
                return single;
        }
        else
                return single;
}

singleton* singleton::getInstance(){
        if (!flag)
        {
                single= new singleton;
                flag=true;
                return single;
        }
        else
        {
                return single;
        }
}

void singleton::terminate(){

        delete single;
        single= NULL;
        perror("Recover allocated mem ");
}


singleton::singleton(int wIn,int lIn){

        width= wIn;
        len= lIn;
}

singleton::singleton(){
        width= 8;
        len= 8;
}
//main=======================================
#include <iostream>
#include "singleton.h"

bool singleton::flag= false;
singleton* singleton::single= NULL;

int main(){

        singleton* a= singleton::getInstance();
        singleton* b= singleton::getInstance(9,12);
        cout << a->getArea()<<endl;
        //a->terminate();
        cout << b->getArea()<<endl;
        a->terminate();
        b->terminate();
        return 0;
}
4

2 に答える 2

3

あなたの主な機能で

singleton* a= singleton::getInstance();

したがって、インスタンスは、シングルトンが空のコンストラクターから取得した値に設定されます。その後、あなたは

singleton* b= singleton::getInstance(9,12);

flagしかし、空のコンストラクターで true に設定したため、それが true であることを忘れていました。したがって、この行は無意味です。

その後、bで行うことはすべてaで行った場合と同じであるため、意図したとおりに機能しません

于 2013-08-25T13:46:11.923 に答える
1

このmain()関数は、シングルトンの「構築」と破棄をインターリーブします。

あなたが何を期待していたのかわかりませんが、2 つのポインターabが分離されていると、別の出力が得られます。

両方aでありb、同じオブジェクトを指しているため、呼び出しgetArea()は同じ結果を返します。

于 2013-08-25T13:55:00.300 に答える