0

私はC++が得意ですが、シングルトンがどのように機能するかを理解しようとしています。だから私はここでコードや記事を調べていまし

コードが表示されたら、

class Singleton
{
private:
    static bool instanceFlag;
    static Singleton *single;
    Singleton()
    {/*private constructor*/}
public:
    static Singleton* getInstance();
    void method();
    ~Singleton()
    {instanceFlag = false;}
};

bool Singleton::instanceFlag = false;
Singleton* Singleton::single = NULL;
Singleton* Singleton::getInstance()
{
    if(! instanceFlag)
    {
        single = new Singleton();
        instanceFlag = true;
        return single;
    }
    else
    {return single;}
}

void Singleton::method()
{cout << "Method of the singleton class" << endl;}

int main()
{
    Singleton *sc1,*sc2;
    sc1 = Singleton::getInstance();
    sc1->method();
    sc2 = Singleton::getInstance();
    sc2->method();

    return 0;
}

上記のコードでは、を出力しMethod of the singleton class twiceます。2回印刷したいのならoutput、なぜシングルトンが必要なのですか。私たちは次のように書くことができます。

sc1->method();
sc2->method();

上記のような複雑なコードが必要なのはなぜですか。私が気づいたことの1つは、instanceFlag条件がonjectで満たされると真になりますがsc1、オブジェクトsc2が呼び出されると、それはelse一部になります。

So, what exactly we are trying to do here?
4

3 に答える 3

3

シングルトンの意味を理解するためにウィキペディアを読むことをお勧めします

基本的に、クラスのオブジェクトを常に1つだけにしたい状況では、このようなパターンを使用します

このコードでSingleton::getInstance()は、はクラスのこの1つのオブジェクトを返すことを意味します。初めて呼び出すと、オブジェクトが作成されます。以降のへの呼び出しSingleton::getInstance()では、同じオブジェクトが返されます。instanceFlagオブジェクトがインスタンス化されているかどうかを追跡します。

もう1つのヒントは、コンストラクターがプライベートであるということです。これは、GetInstance()関数以外にクラスのインスタンスを取得する方法がないことを意味します。

ps私はあなたに同意しますが、このコードは以前よりも複雑です..また(技術的に)メモリリークがあります..インスタンスは決してdeletedではありません

これは私がより頻繁に見るものです

static Singleton* getInstance()  
{  
    static Singleton instance;  
    return &instance;  
}  
于 2012-11-19T06:43:54.150 に答える
1

名前が示すように、クラスの最大1つのオブジェクトが必要な場合は、シングルトンデザインパターンが使用されます。

以下は、シングルトンがどのように達成されるかについての簡単な説明です。

場合によっては、そのインスタンスを1つだけ作成できるクラスを宣言する必要があります。

独自のメディアプレーヤーを作成していて、Windows Media Playerのように動作させたいとします。これは、ご存知のとおり、1つのインスタンスしか作成できず、2つのWindowsMediaPlayerを同時に実行することはできません。技術的に言えば、WindowsMediaPlayerのオブジェクトは1つしか作成できません。この概念を実装するために、次の方法でクラスを宣言できます。

class media_player                                   // Class for creating media player
{
         static media_player player  =  null;             // static object of media_player which will be unique for all objects

         other static members...........                    // you can provide other static members according to your requirement

         private media_player()    // Default constructor is private 
         {

         }

        public  static createInstance( )      // This method returns the static object which will be assigned to the new object
        {
               if(player==null)                            // If no object is present then the first object is created
               {
                       player = new media_player();
               }
              return player;                               
       }

       other static functions..............    // You can define other static functions according to your requirement

}

このクラスのオブジェクトを作成すると、staicオブジェクト(プレーヤー)が返され、新しいオブジェクトに割り当てられます。

最後に、1つのオブジェクトのみが存在します。

この概念は、システムにマウスのインスタンスを1つだけ持つためにも使用されます。つまり、システムに2つのマウスポインターを置くことはできません。

このタイプのクラスは、シングルトンクラスと呼ばれます。

于 2012-11-19T06:46:08.117 に答える
1

重要なのは、何かが実行される回数ではなく、クラスの単一のインスタンスによって作業が行われるということです。これは、クラスメソッドによって保証されSingleton::getInstance()ます。

于 2012-11-19T06:46:29.687 に答える