のは、あなたがこのことについて確信していると仮定しましょう当分の場合:受信クライアントコードが変更できないようにComponentA
は 、 ポインタのセットを所有しているstd::set<Thing *>
、そしてあなたはそれがそのセットを返すメソッドを持っているしたいのですが、それ。あなたは次のようなことをするかどうかは分かりません。
- セットのコピーを返します。
- セットへの参照を返します。
- セットの[
begin()
、end()
]の範囲を返します。
これらの操作は行わないでください。それぞれがあなた自身を特定した欠陥を持っています。 とにはのセットが返されないという追加の欠陥があります。イテレータ範囲を受信するクライアント コードは、それががを設定し、 がセットの定義特性を利用することができません区切ることを知ることができません。代わり
、const
方法からセットにconst
参照を返す:
struct ComponentA
{
...
...
std:set<Thing *> const & get_set_of_things() const {
return things;
}
private:
std::set<Thing *> things
...
};
これはの欠点除去 - クライアントコードが const
参照して設定を変更することはできません - それ他の絡み目がない。
私は、それがあなたの質問に答える願っていが、私はそれはあなたの設計上の問題の終わりではないんです。
クライアントコードはget_set_of_things()
によって返さ std:set<Thing *> const &
を通じてthings
を変更することはできません。しかし、 私が変更できないものは、そのセットのメンバーです。単に ポインタ〜Thing
です。私は確かにそれらのポインタは何か気にしない - 0x1a04c20
のようなメモリアドレス - と私はの変更に興味がありません。しかし、何も は、それらのポインタ が指しているThings
のいずれかを修正するのをやめさせています。
ComponentA ca;
...
auto const & things = ca.get_set_of_things;
Thing * pthing = *things.begin();
thing->modify();
...
これはca
によって制御さThings
の一つ修正 - あなたがないようにしたい ものです。あなたはComponentA
オブジェクトからセットを返す
ただし、限り、あなたは彼らにThing *
-pointersを与えているように、オブジェクトによって制御さ Things
の変更からクライアントを防ぐことはできません。
さてあなたはconst
ポインタのセットにthings
を変更することで、この脅威をブロックすることができます:
struct ComponentA
{
...
...
std:set<Thing const *> const & get_set_of_things() const {
return things;
}
private:
std::set<Thing const *> things
...
};
しかし、その変化の放射性降下物が今ComponentA
自体が Things
を変更することはできませんということですthings
によって制御されます。あなたはそれで暮らすことができますか?
そして、これはあなたのComponentA
はポインタのセットを制御する情報で をトリガしているいくつかの派手なデザインのアラームのちょうど最初のものです。 あなたのクラス定義をドラフトして、SOの姉妹サイトCode Reviewに のコメントを載せることをお勧めします。 コードが存在しない場合は特に のすべての可能性のある落とし穴を調べるのは、SOの範囲を超えています。
APIのユーザーは何が必要ですか?彼らはそれがセットであることを知っているべきですか? – doctorlove