2010-11-08 37 views
3

請參考Wikipedia:Strategy Pattern (C++)C++ - 爲什麼我們應該在這個構造函數中使用explicit?

class Context 
{ 
    private: 
     StrategyInterface * strategy_; 

    public: 
     explicit Context(StrategyInterface *strategy):strategy_(strategy) 
     { 
     } 

     void set_strategy(StrategyInterface *strategy) 
     { 
      strategy_ = strategy; 
     } 

     void execute() const 
     { 
      strategy_->execute(); 
     } 
}; 

爲什麼它是一個很好的做法,使用顯式上下文的構造?

謝謝

+0

如果不使用'explicit'的好地方,又是什麼? – Potatoswatter 2010-11-08 05:23:23

+4

@Patatoswatter:任何地方你都有一個班級的名字不能在有禮貌的公司中大聲說出。 – 2010-11-08 05:41:36

+0

詹姆斯的上述評論不被重視;只是爲了天真的初學者 – Jaywalker 2010-11-08 06:20:36

回答

6

那麼,顯式構造函數總是安全的,但可能不方便。 explicit確保編譯錯誤,您應提供StrategyInterface*,其中Context是預期的。這樣做可以防止臨時建造Context。這一點在某些情況下尤爲重要,例如:

  • Context採取指向的StrategyInterface的所有權,並刪除其在析構函數
  • Context建築/銷燬執行其他昂貴或不當行爲
  • 它歧義消除一些操作是隱含的,並且使其他模糊不清,在那裏讓程序員考慮如何解決模糊性可能更合適(例如,如果試圖比較ContextStrategyInterface*產生編譯時錯誤,導致比較StrategyInterface*StrategyInterface個S或Context S')

如果Context實際上是一個下拉更換爲StrategyInterface,只是有一些小的記錄或其他增強功能,那麼可以適當允許隱式建築,多爲std::string可以從const char*構建。當它們顯然是獨立的事物時,或者當Context的生命週期應該超出StrategyInterface的任何給定用法時,則指示明確的構造函數。

(注:這些準則是相當粗糙 - 超過結束的起點 - 歡迎評論)

13

,因爲通常使用explicit除非你真的允許隱式轉換是一個好主意。由於您不太可能在隱式轉換獲得任何收益的情況下使用Context對象,因此最好使其成爲explicit

相關問題