C 單例模式

2022-08-22 18:18:11 字數 2181 閱讀 8803

單例模式中乙個類只有乙個對應例項

1. 懶漢式

#include using namespace std;

class foo

void print()

private:

int data1;

int data2;

foo(int data1) :data1(data1)

foo(const foo&) = delete; // 拒絕複製構造

foo& operator=(const foo&) = delete; // 拒絕賦值

static foo* m_pinstance;

};//私有靜態成員必須先初始化

foo* foo::m_pinstance = nullptr;

int main()

/* 問題

1. 多執行緒時 m_pinstance 競爭

2. 記憶體洩漏, 因為沒有 delete */

2. 執行緒安全、記憶體安全懶漢式
#include #include #include using namespace std;

class foo

return m_pinstance;

}void print()

private:

int data1;

int data2;

foo(int data1) :data1(data1)

foo(const foo&) = delete; // 拒絕複製構造

foo& operator=(const foo&) = delete; // 拒絕賦值

static shared_ptrm_pinstance;

static mutex m_mutex;

};//私有靜態成員必須先初始化

shared_ptrfoo::m_pinstance = nullptr;

mutex foo::m_mutex;

int main()

3. 推薦懶漢式 (magic static)
#include using namespace std;

class foo

void print()

private:

int data1;

int data2;

foo(int data1) :data1(data1)

foo(const foo&) = delete; // 拒絕複製構造

foo& operator=(const foo&) = delete; // 拒絕賦值

};int main()

4. crtp 奇異遞迴模板單列模式

在某些情況下,我們系統中可能有多個單例,如果都按照這種方式的話,實際上是一種重複,有沒有什麼方法可以只實現一次單例而能夠復用其**從而實現多個單例呢?

templateclass foo

virtual ~foo() {}

void print()

protected:

int data1;

int data2;

foo(int data1) :data1(data1)

foo(const foo&) = delete; // 拒絕複製構造

foo& operator=(const foo&) = delete; // 拒絕賦值

};// 為了保證每個繼承類都是單例

class derive :public foo;

5. 函式模板返回引用方式單例
class a

~a(){}

};templatet& get_global()

int main()

6. 餓漢單例模式
// 執行緒安全

class foo

private:

foo(){}

foo(const foo&) = delete; // 拒絕複製構造

foo& operator=(const foo&) = delete; // 拒絕賦值

static foo* m_pinstance;

};foo* foo::m_pinstance = new foo(); // 靜態直接初始化

C 單例模式

include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...

C 單例模式

實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...

C 單例模式

效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...