mutableな参照を返さないために
えーと、今日は作業はほとんど進まず、設計を少し弄っただけです。
前から気になっていた問題なんですが、コンテナをメンバに持つクラスで、そのコンテナを外部から自由に弄らせたい場合、よく
void bar_check(int x); // 何かのチェック関数 class hoge { public: std::list<foo>& foo_list() { return foo_list_; } void bar(int x) { bar_check(x); // 必ずこのチェックを通す必要があるので、カプセル化が必要 bar_ = x; } private: std::list<foo> foo_list_; int bar_; };
みたいに書いていました。
メンバ変数をpublicにしたくないけど全機能を使うためには参照を返すしかなく、実質的にメンバ変数を公開してしまっているのに変に拘ってるせいで無駄にアクセスしづらくなっている、という状態でした。
かといって、他のメンバのカプセル化のため構造体(全部publicの意味)にするわけにもいきません。
で、今日気が付いたのは、カプセル化が必要な箇所だけ別クラスにすればいいということでした。
要するに、
class bar { public: void set(int x) { bar_check(x); value_ = x; } private: int value_; }; struct hoge { std::list<foo> foo_list; bar b; };
とするだけです。
なんでこんな簡単なことに気が付かなかったんでしょうね。