C Singleton單例模式

2022-04-25 08:35:59 字數 4049 閱讀 7859

//【實現單例步驟】

// 1.建構函式私有化

// 2.增加靜態的、私有的當前類的指標變數

// 3.提供乙個靜態的公有介面,可讓使用者獲得單例物件

1 #include2

3using

namespace

std;45

classa6

;9public:10

static a*getinstance() //步驟3

1114

private:15

static a*a; // 步驟2

16};

1718 a* a::a =nullptr;

19//

【實現單例步驟】

20//

1.建構函式私有化

21//

2.增加靜態的、私有的當前類的指標變數

22//

3.提供乙個靜態的公有介面,可讓使用者獲得單例物件

2324

//單例:懶漢式 、惡漢式

25//

<1> 懶漢式

26class

singleton_lazy 27;

30public:31

static singleton_lazy*getinstance()

3237

return

psingleton_lazy;38}

39private:40

static singleton_lazy*psingleton_lazy;

41};

42 singleton_lazy* singleton_lazy::psingleton_lazy =nullptr;

4344

//<2> 餓漢式

45class

singleton_hungry46;

49public:50

static singleton_hungry*getinstance()

5154

private:55

static singleton_hungry*psingleton_hungry;

56};

57 singleton_hungry* singleton_hungry::psingleton_hungry = new singleton_hungry;//

直接在類外建立單例物件

可以看到,惡漢模式在main執行之前已經初始化好了。

舉例子:slam中我們需要在多個檔案中讀取引數檔案,所以,這裡必須把config寫成 singleton。它只有乙個全域性物件,當我們設定引數檔案時,建立該物件【整個程式之建立乙個物件】並讀取引數檔案,隨後可以在任意位置讀取該檔案中的引數值。

1

class

config2;

6cv::filestorage file_;

7public

:8 ~config();9//

<3> 步驟3:提供靜態的、公有的介面;可讓使用者獲取單例

10static

void setparameterfile(const std::string& filename); //

類似於 static void getinstance()

1112 template13

static t get(const std::string&key)

1417

18private:19

//<2> 步驟2:增加靜態的、私有的當前類的指標

20static std::shared_ptrconfig_;

21};

2223 std::shared_ptrconfig::config_ =nullptr;

2425

void config::setparameterfile(const std::string &filename)

2631 config_->file_ =cv::filestorage(filename.c_str(), cv::filestorage::read);

32//

異常處理

33if (config_->file_.isopened() == false)34

39}4041 config::~config()

42

47 }

顯然這裡是懶漢模式,不過它新增了靜態 模板型別的 get函式;

呼叫方式如下:

1 config::setparameterfile("

myparameter.yaml

"); // 獲取乙個單例物件

2double distance = config::get

("distance

");//通過靜態成員函式獲取引數,static能去掉?

不能去掉,原因:與普通的成員函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標.從這個意義上來說,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,只能呼叫其他的靜態成員函式.

myparameter.yaml

1 %yaml:1.02#

data3#

the tum dataset directory, change it to yours! 4#

dataset_dir: /media/xiang/data/dataset/kitti/dataset/sequences/00

5 dataset_dir: /mnt/1a9286bd92869cbf/dataset/kitti/dataset/sequences/0567

#camera intrinsics

8 camera.fx: 517.3

9 camera.fy: 516.5

10 camera.cx: 325.1

11 camera.cy: 249.7

1213 num_features: 150

14 num_features_init: 50

15 num_features_tracking: 50

//將上述兩個模式中的指標改為 共享指標

1 #include2 #include3

4using

namespace

std;56

class

singleton_lazy7;

10public:11

//static singleton_lazy* getinstance()

12static shared_ptrgetinstance()

1319

return

sp;20}21

private:22

//static singleton_lazy* sp;

23static shared_ptrsp;

24};

25//

singleton_lazy* singleton_lazy::sp = nullptr;

26 shared_ptrsingleton_lazy::sp =nullptr;

2728

class

singleton_hungry29;

32public:33

//static singleton_hungry* getinstance()

34static

void

getinstance()

3539

private:40

//static singleton_hungry* sp;

41static shared_ptrsp;

42};

43 shared_ptrsingleton_hungry::sp = shared_ptr(new

singleton_hungry);

4445

intmain()

46

C Singleton單例模式

version6 include using namespace std templateclass singleton protected 保護型別,因為子類繼承的時候要呼叫父類建構函式,寫成public肯定不行,寫成private子類就無法訪問,就需要寫friend class manager了...

C Singleton單例實現方式

1.singleton模式的意圖是什麼?或者說使用singleton模式解決的問題是什麼?答 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享!2.解決上述問題的方法 方法一 全域性變數或是靜態變數 此方法存在的問題 這樣做雖然能保證方便的訪問例項,但是不能保證只宣告...

c singleton 單例類的實現

單例設計模式是一種軟體設計原理,用於將類的例項化限制為最多乙個物件。當僅需要乙個物件來協調整個系統中的運作時,單例模式就很有用。例如,如果您使用的是將日誌寫入檔案的記錄器,則可以使用單例類建立此類記錄器。class singleton singleton const singleton delete...