讀書筆記 Effective C

2022-03-01 13:32:30 字數 2047 閱讀 6960

背景是這樣的,有兩個不同的公司,然後想設計乙個messagesender,為這兩個公司傳送不同的訊息,既支援明文傳送sendcleartext,也支援密文傳送sendencryptedtext。一種思路是採用動態繫結的方法,定義乙個basicmessagesender,裡面有兩個方法,分別是傳送明文和密文的虛函式,然後定義它的子類messagesenderforcompanya,以及messagesenderforcompanyb,在這兩個子類裡面覆蓋傳送明文和密文的虛函式,從而達到根據不同公司傳送不同訊息的目的。

但這裡我們想換一種思路,使用靜態多型的方法來實現,靜態多型就是模板的技術了,**如下:

1

class

companya25

void

sendencryptedtext(){}6};

789class

companyb

1013

void

sendencrypedtext(){}

14};

1516 template

17class

msgsender

1821

};22

23 template

24class msgsenderwithlog: public msgsender25

32};

3334

intmain()

35

companya與companyb有各自的傳送函式,然後有乙個模板類msgsender,這個模板待確定的引數是t,可以是companya或者companyb,這樣就可以在定義msgsender時,比如msgsender或者msgsender,指定到底呼叫的哪個公司的傳送函式了,這是在編譯期就可以確定下來的事情。

但現在有乙個新問題,那就是我們希望在執行傳送函式之前,還是加上日誌比較好,這樣我們就繼承了msgsender,定義了乙個新類msgsenderwithlog,在這裡定義了乙個新的函式sendcleartextwithlog,在這個函式裡面呼叫了父類的sendcleartext。

對於這段**,其實思路還是挺清晰的,但問題是有的編譯器會編不過這行**(vs2008以後的版本的都是可以的,之前的版本沒試),為什麼?

這是因為在模板技術中存在全特化的概念,比如c公司,這個公司根本不想傳送明文,也就是說它只有sendencryptedtext()介面,沒有sendcleartext()。為了使我們的靜態多型仍然可用,我們這樣定義只適用於c公司的msgsender:

1

class

companyc25

};67 template <>

8class msgsender9

12 };

這時候如果去呼叫:

1 msgsenderwithlogmsgsenderc;

2 msgsenderc.sendcleartextwithlog(); //

編譯器無法通過編譯

這樣編譯器會報找到sendcleartext()的錯。正是因為有的編譯器考慮到了全特化模板版本可以與普通版本不同,所以在有繼承關係存在時,對直接呼叫父類的函式給出了不支援的error。但這個error是與編譯器相關的,不是必然出現的。

方法一: 將

1

void

sendcleartextwithlog()26

改成7void

sendcleartextwithlog()

8

方法二:

在子類中宣告using msgsender::sendcleartext;

編譯器報error本質是不進行模板父類域的查詢,所以這裡using了父類的乙個函式名,強制編譯器對之進行查詢。

方法三:

將sendcleartext()指明為msgsender::sendcleartext()。

最後總結一下:

可在derived class template內通過「this->」指涉base class templates內的成員名稱,或借由乙個明白寫出的「base class資格修飾符」完成。

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...

Effective C 讀書筆記

一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...

讀書筆記 Effective C

部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...