effective C 條款三十五解讀

2021-08-07 10:09:04 字數 1708 閱讀 3374

考慮virtual函式以外的其他選擇

我們乙個遊戲軟體的血量計算方法為例來講解這個主題,我們在遊戲中有不同的遊戲人物,不同遊戲人物的血量計算方式不同,這驅使我們寫出這樣的物件導向**。

class gamecharacter

這裡我們的實現是public的virtual形式。

這麼乙個簡單的實現可以延伸出很多不同但既有優點又有缺點的做法:

1.借助non-virtual inte***ce(nvi)手法實現template method(一種設計模式)。其實就是在虛函式外面包裹了一層呼叫。

2.借助(函式指標以及函式物件)實現的strategy模式。

3.古典的strategy設計模式。

借助nvi的手法;

class gamecharacter

private:

virtual int dohealthvalue() const;

}

這種方法我們通過public的非虛函式呼叫其私有的虛函式來實現,允許在多型呼叫前,進行一些設定工作,有一些特化的功能交給派生來處理。這種方法就是模板方法。這種方法其實沒有擺脫虛函式,只是加了一層封裝而已。

我們再來看借助函式指標以及函式物件來實現的strategy模式:

用**來進行講解

class  gamecharacter;

int defaulthealthcalc(const gamecharacter&);

class gamecharacter

private:

healthcalcfunc healthfunc;

};

這種方式的好處的有兩個:

1.同乙個人物型別之不同實體可以有不同的健康計算函式。

2.同乙個實體的健康計算函式也可以在執行期改變。通過設定健康計算函式。

但是隨之而來也產生了一些問題,比如首先這個外部提供的函式可能無法訪問私有變數,如果通過一些函式訪問私有變數,就降低了類的封裝性。

利用函式物件實現的strategy方式就提供了更佳的彈性:可以用所用的可呼叫物件對其複製,可進行一些轉換。

class gamecharacter;

int de****ehealthfunc(const gamecharacter&);

class gamecharacter

int healthvalue() const

private:

healthcalcfunc healthfunc;

};

利用以上函式我們可以完成許多函式指標沒有辦法完成的事情:

short calchealth(const gamecharacter&);//注意這個函式的返回型別是short,可以轉換成int型。

struct healthcalculator

struct gamelevel

gamecharacter gc1(calchealth);

gamecharacter gc2(healthcalculator());

gameleve gl;

gamecharacter gc3(bind(&gamelevel::health,gl,-1));

effective C 條款二十五解讀

考慮寫出乙個不丟擲異常的高效的swap函式 首先得說明為什麼我們要優化我們的swap函式,swap函式是異常安全性程式設計的脊柱,同時也是處理operator 自我賦值的重要手段。要編寫乙個優化版本的swap函式,我們首先需要了解標準庫是怎們定義的swap函式 namespace std 這個函式很...

出差(三十五)

今天早晨到會議室後便買好了明天回公司的車票,長達乙個多月的出差生活即將告一段落,利用假期回去休息幾天,換換心情。經過這乙個多月的封閉式開發,對專案,對團隊有了進一步了解,感受到了創業公司的不易,也再次體驗了三點一線的生活方式,已經遠超996的工作模式,即使這樣依舊離目標有很大距離,主要原因還是缺少乙...

Effective C 經驗條款

高效c 4 必須返回物件時,別妄想返回其reference 這句話什麼意思呢?就是在乙個函式內,如果你需要這個函式返回乙個新的物件,那麼這個函式的返回值型別就不要定義成引用型別。就直接返回這個類型別。首先,我們知道在函式傳遞引數時,傳遞引用的好處,尤其是對那麼比較大的型別,但是對於內建型別和stl的...