首先是繼承方式,為了進行單例的派生,需要將基類的建構函式以及拷貝賦值函式設定為protected成員
template class singleton
; singleton(const singleton &);
singleton &operator=(const singleton &);
public:
static t* get_instance();
static void free_instance();
}
繼續記錄之前 需要了解一下c++的繼承機制
注意:派生類訪問說明符對於派生類的成員以及友元能否訪問其直接基類的成員沒什麼影響。對於基類的成員的訪問許可權只與基類中的訪問說明符有關。派生訪問說明符的目的是控制派生類使用者
(包括派生類的派生類在內)對於基類成員的訪問許可權 c++ primer 544頁
以及友元類的機制
友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說白了就是:甲願意把甲的秘密告訴乙,但是乙不見得願意把乙自己的秘密告訴甲。
#include "father.h"
class a;
1)在a類中,將b類定義成友元
2)寫乙個c類繼承自b類
3)在b類和c類的建構函式中分別建立a物件,並定義其內部的三個變數
4)在a類的建構函式中建立b物件,並定義其內部的三個變數
結果及注意事項:
1)b類中建立的a物件允許直接訪問a類中所有變數
2)c類中建立的a物件只允許直接訪問a類中public變數
3)由第二點可知,友元關係無法繼承
4)a類中建立的b物件只允許直接訪問b類中的public變數
5)由第四點可知,友元關係是單向的,即a為b友元,b並不是a的友元,需要另外單獨定義
注意:a類中定義 b類為友元,則b類中可以使用a中所有的變數
基礎都忘記了,複習了一遍後繼續來單例
有了單例的基類後,接下來就是繼承使用它了。於是乎,自定義乙個類test繼承自基類,此時需要注意繼承的方式,public,private,protected,由於需要在在使用時使用 test::get_instance()的方式,所以需要使用public來繼承。
class test : public singleton
相信想我一樣的c++新手絕對對這個東西一臉懵逼..................自己繼承自自己的感覺......................
template
class a
class b:public a
對於這樣的形式,b類是如何構造的? 舉個栗子 o(∩_∩)o~~:
template class a
};class b : a
};
宣告乙個b b 必然會執行b的建構函式b(),由於b是繼承而來的,所以要執行基類的建構函式,於是執行a(),在該例子中,a()中執行 t=new t(),於是又會執行b的建構函式b(),於是接著又是a()從而造成了死迴圈。。。所以可知,在a的建構函式中不能出現對於b的生成操作,不然會死迴圈。
template class a
};class b : a
};
這樣 b b就不會出現錯誤了。
由於是單例,所以需要建構函式為保護或者私有,可以寫出
class test:singleton
此時,使用test::get_instance()問題又出現了,首先呼叫
test::get_instance(),然後呼叫singleton類中的get_instance()函式,執行到new t()的時候跳轉執行test類的建構函式test(),然後就像上述說的過程,壓棧跳轉執行singleton類的建構函式singleton(),執行完畢後跳回test(),然後在跳回到new t(),return t完成。 但是由於test類的建構函式為私有或者保護,無法執行new t(),為了能使得get_instance()函式所在的類能執行new t() ,所以需要將singleton設定為test的友元函式,這樣singleton類就行使用test的所有成員。
所以整體為:
template class singleton
; singleton(const singleton &);
singleton &operator=(const singleton &);
public:
static t* get_instance();
static void free_instance();
}
class test: public singleton
public:
//do
}
其他service 單例 工具類 單例模式總結
單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。1.單例模式的特點 1.單例類只能有乙個例項。2.單例類必須自己建立自己的唯一的例項。3.單例類必須給所有其他物件提供這一例項。2.餓漢式單例類 public class eagersingleton 靜態工廠方法 retur...
單例 單例模式
簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...