C 實現單例模式

2021-09-22 08:57:43 字數 2288 閱讀 8504

單件模式(singletonpattern):確保乙個類只有乙個例項,並提供乙個全域性訪問點。和全域性變數一樣方便,又沒有全域性變數的缺點,即不需要從一開始就建立物件,而是在需要時才建立它。

那麼要如何保證乙個類只能被例項化一次呢?一般情況下,如果存在乙個類,我們都是可以多次地例項化它的。那麼如果這樣呢:

1

public

myclass

4 }

咦?建構函式私有?含有私有的構造器的類應該是不能被其他類例項化的,因為只有myclass內部的**才能呼叫這個私有的建構函式。雖然只有myclass類的例項才能呼叫myclass構造器,但在這之前,必須有乙個myclass例項。然而這個類又不能被例項化,這樣就產生了矛盾!

看下面這段**:

1

public

myclass

4 }

上面的**表示myclass有乙個靜態方法,我們可以這樣呼叫這個方法:myclass.getinstance(); 因為getinstance()是乙個靜態方法,換句話說,是乙個「類」方法。引用乙個靜態方法,你需要使用類名,而不是物件名。

那麼把上面兩段**合在一起,是否就可以使myclass只產生乙個例項了呢?

看下面的**:

1

public

class

myclass6//

用getinstance靜態方法例項化物件,並返回

7public

static

myclass getinstance()

12return

uniqueinstance;13}

14//

當然,單件類也是乙個正常的類,具有其他的變數和方法

15//

...16 }

這就是乙個經典的單件模式的實現!之所以例項唯一,是因為單件類沒有公開的構造器,其他類不能自行將其實例化得到乙個例項,而必須通過它的靜態方法getinstance()去建立乙個例項。

c++完整實現

singleton.h

1

#pragma once23

class

singleton;

singleton.cpp

1 #include"

singleton.h

"2 #include3

using

namespace

std;45

singleton::singleton()

89 singleton::~singleton()

13delete uniqueinstance;

14 uniqueinstance = 0;15

}1617 singleton*singleton::getinstance()

21return

uniqueinstance;

22 }

main.cpp

1 #include2 #include"

singleton.h"3

using

namespace

std;

45 singleton* singleton::uniqueinstance =null;67

intmain()

13else

16return0;

17 }

乙個完整的單例模式**:

1 #include2

using

namespace

std;

3class

csingleton

48 ~csingleton()

12delete

m_pinstance;

13 m_pinstance =null;14}

15static csingleton *m_pinstance;

16public:17

static csingleton *getinstance()

22};

23 csingleton* csingleton::m_pinstance = null;//

類的靜態成員變數需要在類外邊初始化

2425

intmain()

33return0;

34 }

C 實現單例模式

給所需要進行單例的類ctest的建構函式宣告為private或者protected 防止在類外隨意生成ctest的物件 然後宣告乙個靜態成員變數 instance 乙個靜態成員函式getinsance staticctest getinstance staticctest instance 靜態成員...

C 實現單例模式

ifndef singleton h define singleton h include include using namespace std class locker inline locker inline void lock inline void unlock private pthre...

C 實現單例模式

class singleton 私有建構函式 singleton const singleton 拷貝建構函式,只宣告不定義,這要當使用者或友元想要拷貝構造該類的已存在例項時會出錯。singleton operator const singleton 賦值運算子,只宣告不定義,作用同上 public...