2013-02-14 7 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; 
}; 

質問>私はレガシープロジェクトで上記のような多くのコードを見ました。 私は本当にそのようなことを理解していません。 なぜ単に代わりに以下を提供していない:なぜ2つのゲット関数を提供するのですか?

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オブジェクトが事故によってTを変更させないということかもしれません。そのような場合には、そのようなすべての機能が2つのバージョンを提供することが練習ですか?私にとっては、とても退屈な気がする!

答えて

9

あなたは正しいです:boost::shared_ptr<const T> getT() constの目的は、constオブジェクトが偶然によってTを変更できないようにすることです。

C++では、これは const correctnessと呼ばれ、通常は良いC++デザインとみなされます。あなたが言ったように、それは、多くの場合、2つのバージョン(constと非constバージョン)を有するゲッターになります。最初は面倒なことがあります(慣れてもそれほど悪くはありません)が、結果は非常に役立ちます。 constの正しさは、あなたがDoSomethingはおそらくitemを変更すると宣言しています何もしない場合、コンパイラはエラーをスローするようにitemを変更しないことを約束

void DoSomething(const AccessT& item); 

のような関数を宣言することができます。

constの正しさは、通常は良いC++の設計であると考えられているが、一部の開発者はそれの価値よりも多くのトラブルであることを、いくつかの機能のconstと非constバージョンを宣言することのオーバーヘッドと判断しました。

あなたはより多くの情報に興味があるならC++ FAQは、constの正しさにa whole sectionを持っています。

1

このパターンはアクセサークラスの必要性が感じられる場合には一般的ですが、作成者はアクセスと常時アクセスのためにAccessTAccessTconstを定義することを望んでいません。あなたが見るハックは、一定で定数ではない定数を使って定数と非定数のアクセスを可能にする、あまり退屈でない方法です。

このパターンの利点は、簡単に実装され、欠点は、あなたが「のconstポインタ」と「CONSTへのポインタ」の概念を付き合うということです。 AccessTがsetTのメンバーを提供している場合は、コンスタンスに関する混乱が起こります。

あなたは、例えば示さconst_パターンで、このアクセスパターンを対比することができますconst_iteratoriteratorとして来て、変更イテレータと変更反復のすべての4つの組み合わせが可能イテレータによる。

関連する問題