C++シングルトンクラステンプレートの詳細説明

この記事では主に C++ シングルトン クラス テンプレートを紹介します。サンプル コードを通じて詳細に紹介されています。すべての人の学習や仕事に一定の参考学習価値があります。必要な友人は、Weidian Reading の編集者をフォローして一緒に学ぶことができます

シングルトンクラス

説明する

これは、システムのライフサイクル全体において、クラスは最大でも 1 つのインスタンスのみを持つことができ、インスタンスを一意にすることを意味します (インスタンスはオブジェクト ポインターを参照します)。たとえば、オンラインの人数を数える

シングルトンクラスではLazyスタイルとHungryスタイルに分かれており、両者の違いはインスタンス作成時の時間にあります。

  1. 遅延スタイル: コードの実行後はインスタンスが存在せず、必要な場合にのみインスタンスが作成されることを意味します (シングル スレッドに適用)
  2. ハングリー スタイル: コードが実行されるとすぐにインスタンスがすでに存在することを意味し、必要なときに直接呼び出すだけです (マルチスレッドに適用可能)

使用法

  1. コンストラクターのアクセス属性をプライベートに設定し、
  2. ユーザーに単一のインスタンスへのアクセスのみを提供できる GetInstance() 静的メンバー関数を提供します。
  3. ユーザーが取得できる静的メンバー ポインターを定義します。
  4. オブジェクト間でのコピーを避けるために、代入演算子 (=) とコピー コンストラクターをオーバーロードし、それらをプライベートに設定します。

シングルトン クラスの予備的な調査 - 遅延スタイル:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

#include <iostream>

using namespace std;

class CSingleton

{

private:

    static CSingleton* m_pInstance;

    CSingleton()     //构造函数为private

    {

    }

    CSingleton& operator = (const CSingleton& t);

    CSingleton(const CSingleton &);

public:

    static CSingleton* getInstance()

    {

       if(m_pInstance==NULL)

           m_pInstance= new CSingleton();

       

        return m_pInstance;

    }

    void print()

    {

      cout<<this<<endl;  

    }

};

CSingleton* CSingleton::m_pInstance = NULL;

int main()

{

    CSingleton *p1=CSingleton::getInstance();

    CSingleton *p2=CSingleton::getInstance();

    CSingleton *p3=CSingleton::getInstance();

    p1->print();

    p2->print();

    p3->print();

    return 0;

}

ランニングプリント:

0x6e2d18
0x6e2d18
0x6e2d18

出力結果から、ポインター オブジェクトがすべて同じアドレスを指していることがわかります。これは、クラスが持つことができるインスタンスは最大 1 つだけであることを意味します。

注: インスタンスはシステムのライフサイクル中に存在するため、システムがまだ実行されている限り削除する必要はありません。

上記の遅延スタイルでは、マルチスレッド状況で複数の Csingleton ポインター オブジェクトが getInstance() メンバー関数を同時に呼び出すと、m_pInstance = NULL であるため、複数のインスタンスが作成されます。

そのため、マルチスレッドの場合はHungry Manを利用して実装する必要があります。

コードは以下のように表示されます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class CSingleton

{

private:

    static CSingleton* m_pInstance;

    CSingleton()     //构造函数为private

    {

    }      

    CSingleton& operator = (const CSingleton& t);

    CSingleton(const CSingleton &);

public:

    static CSingleton* getInstance()

    {

        return m_pInstance;

    }

};

CSingleton* CSingleton::m_pInstance = new CSingleton;

シングルトンクラステンプレート

今説明しているのは単なるフレームワークです 中身が無いとニーズに応えられないので シングルトンクラスのテンプレートヘッダファイルとして記述する必要があります シングルトンクラスが必要な場合はシングルトンクラスのテンプレートを宣言するだけですヘッダファイルを直接。

write-CSingleton.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#ifndef _SINGLETON_H_

#define _SINGLETON_H_

template <typename T>

class CSingleton

{

private:

    static T* m_pInstance;

    CSingleton()     //构造函数为private

    {  

     }   

     

public:

    static T* getInstance()

    

        return m_pInstance;

    }

};

template <typename T>

T* CSingleton<T> :: m_pInstance = new T;

#endif

このシングルトン クラス テンプレートが必要な場合は、自分のクラスの friends を介してそれをフレンドとして追加するだけです。

次にシングルトン クラス テンプレートを試してください

main.cppを書きます

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#include <iostream>

#include <string>

#include "CSingleton.h"

using namespace std;

class Test

{

    friend class CSingleton<Test> ; //声明Test的友元为单例类模板

private

    string mstr;

    Test(): mstr("abc")

    {

    }

    Test& operator = (const Test& t);

    Test(const Test&);

public

    void Setmstr(string t)

    {

     mstr=t;

    }

    void print()

    {

    cout<<"mstr = "<<mstr<<endl;

    cout<<"this = "<<this<<endl;

    }

};

int main()

{

    Test *pt1 = CSingleton<Test>::getInstance();

    Test *pt2 = CSingleton<Test>::getInstance(); 

    pt1->print();

    pt2->print();

    pt1->Setmstr("ABCDEFG");

    pt2->print();

    return 0;

}

mstr = abc
this = 0x2d2e30

mstr = abc
this = 0x2d2e30

mstr = ABCDEFG
this = 0x2d2e30

以上、エディターが紹介したC++シングルトンクラステンプレートの詳細な説明と統合についてでしたので、ご参考になれば幸いです。

転載元:マイクロリーディング   https://www.weidianyuedu.com

おすすめ

転載: blog.csdn.net/weixin_45707610/article/details/131766695