//【實現單例步驟】
// 1.建構函式私有化
// 2.增加靜態的、私有的當前類的指標變數
// 3.提供乙個靜態的公有介面,可讓使用者獲得單例物件
1 #include23using
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顯然這裡是懶漢模式,不過它新增了靜態 模板型別的 get函式;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 }
呼叫方式如下:
1 config::setparameterfile("不能去掉,原因:與普通的成員函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標.從這個意義上來說,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,只能呼叫其他的靜態成員函式.myparameter.yaml
"); // 獲取乙個單例物件
2double distance = config::get
("distance
");//通過靜態成員函式獲取引數,static能去掉?
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 #include34using
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...