M26 限制某個class所能產生的物件數量

2021-09-08 20:33:50 字數 2086 閱讀 6656

1、每當產生乙個物件,必定呼叫構造方法。因此,禁止產生物件的做法就是,將所有的構造方法宣告為private。

2、只有在類的內部才可以訪問private成員,有兩層含義:在類的內部可以訪問this的private成員,同時可以訪問同類物件的private成員。

3、將構造方法宣告為private,只是限制了在外部呼叫構造方法產生物件,還是有辦法可以產生物件。辦法有:

a、類暴露乙個static方法,在static方法內部呼叫private構造方法,產生物件返回。

b、在類中宣告友元方法,或者友元類,這樣的話,就可以訪問該類的private構造方法。

4、考慮,只產生乙個物件。該怎麼辦?使用友元方法,內部有static物件,返回static物件的引用。比如:只產生乙個印表機。

在類中宣告:friend printer& theprinter();

實現為:

printer& theprinter()

static printer p;

return p;

5、上面的方式有個問題,友元方法是個全域性方法,意味著放大了作用域。有沒有更好的辦法呢?

a、第乙個辦法是,使用命名空間,將與printer有關的內容放在這個命名空間內,這樣就縮小了作用域。

b、第二個方法是,讓類暴露乙個static方法。如下:

在類中宣告:static printer& theprinter();

實現為:

printer& printer::theprinter()

static printer p;

return p;

從封裝的角度看,類本身表示乙個範圍,可以認為命名空間的意思。只不過,命名空間內的東西都是public,而類中可以細化為public,protected,private。

6、現在考慮,方法中的static物件。

a、首先一點,對於方法中的static物件,也就是local static物件,方法不被呼叫,static物件就絕不會產生。而對於non-local static物件(包括全域性物件,命名空間內的物件,file作用域,class中的static物件),即使從未被呼叫,也要構造析構物件。從c++的角度看,不要為不使用的東西產生代價。因此,使用local static物件更好。

b、還有第二點,在乙個編譯單元內的static物件,c++保證按宣告的順序初始化,而對於不同編譯單元內的static物件,順序是不確定的,因此,程式設計師不能依賴某種初始化順序。而對於,方法中的static物件,確定是第一次呼叫方法的時候,初始化static物件。

c、還有一點,這個方法不能宣告為inline,思考為什麼?這個方法中,使用static,目的就是,返回的引用都是這個static物件。假如使用inline,可認為編譯器在每個呼叫的地方進行文字替換,這樣的話,就會產生多個static物件,這明顯不是我們所期望的。

7、現在考慮,更一般化的問題。比如,我們有5個印表機,如何限制產生的物件個數不能大於5?

在類中維護兩個字段:已經產生的物件個數numobjects和允許最多的物件個數maxobjects,這兩個欄位對類和所有物件有意義,因此是static。每次構造物件的時候,檢查numobjects8、上面的方式,在呼叫構造方法的時候,對numobjects累加。這將導致下面的兩個問題:

a、考慮,colorprinter繼承printer,例項化colorprinter物件的時候,會呼叫printer 的構造方法,對numobjects累加,這不是我們所期望的。

b、考慮類a中內含printer物件,a a1,a2; 導致呼叫printer構造方法兩次,這也不是我們所期望的。

9、怎麼解決上面的問題? 問題的關鍵是printer物件在3種狀態下生存:a、它自己;b、子類的父類成分中;c、內嵌於其它物件中。因此,解決的辦法是,禁止後面的兩種狀態。也就是將構造方法宣告為private。 構造方法宣告為private,不能被繼承,同時不能在外部呼叫構造方法構造物件。但同時,又必須產生物件給外部用,也就是上面的方法:類暴露static方法,或者類中宣告友元方法或者友元類。

10、考慮下面的問題,如果有很多類似printer的類,該怎麼辦呢?

把共用的**放到父類中,父類負責管理物件的個數,因為可以對不同的類封裝,因此父類是模板類。如下:

class printer: private counted

c 限制某個class所能產生物件數量的方法

1.產生零個或乙個物件 將建構函式與拷貝建構函式宣告為私有成員,並宣告乙個友元函式,在友元函式中宣告乙個靜態成員,呼叫建構函式,並返回乙個靜態成員的引用。另一種方法就是設定乙個計數器,初始化為0.在建構函式中 1,在析構函式中 1,每次保證只有乙個物件。2.不同物件的構造狀態 上述第二種方法在繼承關...

移遠M26實現簡訊接收

具體例子,參照上傳的官方 quectel gsm 短訊息應用指導 v1.1 步驟一.設定短訊息模式 短訊息收發主要分文字和pdu模式,因為pdu涉及到編譯碼,另外專案中傳送的都是英文本元,所以選用文字模式,實現比較簡單 at cmgf 1 r n 步驟二.選擇te字符集 簡訊內容為英文只需要用 gs...

C 限制某個類所能產生的物件數量

或者系統只提供16個可分發出去的檔案描述符,如何確保檔案描述符物件存在的數目不能超過16個。在具體的應用過程中,我們可能需要限制某個類所產生的物件數量。下面我們先從簡單的問題的開始。1.如何允許建立零個物件?例項化乙個物件時,將呼叫乙個建構函式,因而阻止建立某個類的物件,最容易的方法就是把該類的建構...