2013-02-14 54 views
5
class T 
{}; 

class AccessT 
{ 
public: 
    boost::shared_ptr<const T> getT() const {return m_T;} 
    boost::shared_ptr<T>  getT()  {return m_T;} 

private: 
    boost::shared_ptr<T> m_T; 
}; 

問題>我在舊項目中看到了很多與上面類似的代碼。 我真的不明白這樣做的重點。 爲什麼不只是簡單地提供,而不是執行以下操作:爲什麼提供兩個獲取功能

class T 
{}; 

class AccessTModified 
{ 
public: 
    boost::shared_ptr<T> getT() const { return m_T; } 

private: 
    boost::shared_ptr<T> m_T; 
}; 

最初的說法可能是boost::shared_ptr<const T> getT() const不會讓const對象意外修改噸。如果是這樣的話,所有這些功能應該提供兩種版本的做法嗎?對我來說,我感到非常乏味!

回答

9

您是對的:boost::shared_ptr<const T> getT() const的目的是爲了確保const對象無法修改T意外。

在C++中,這被稱爲 const正確性並且通常被認爲是很好的C++設計。正如你所說的,它往往會形成具有兩個版本(一個const和非const版)干將。它可能最初很單調乏味(儘管一旦習慣了它並不壞),但結果可能非常有用。 const正確性讓你聲明的功能,如

void DoSomething(const AccessT& item); 

,承諾不修改item因此,如果DoSomething確實是被聲明爲可能修改item任何編譯器會引發錯誤。

雖然const正確性通常被認爲是良好的C++的設計,一些開發商決定,不必申報常量和某些功能的非const版本是更多的麻煩比它的價值的開銷。

的C++ FAQ對const正確性a whole section,如果你有興趣瞭解更多的信息。

1

當感覺到需要訪問器類時,這種模式很常見,但作者並不想完全定義AccessTAccessTconst來訪問和持續訪問。你看到的破解是通過常量和非常量訪問器使常量和非常量訪問成爲可能的簡單方法。

這種模式的優點是實現簡單,缺點是你打成一片「常量指針」和「指針爲const」的概念。如果AccessT提供setT成員,則會出現關於常量的混淆。

可以對比用例如示出的const_圖案此訪問模式通過迭代器,這來作爲const_iteratoriterator並且允許可變迭代和迭代多變的所有四種組合。

相關問題