- C++相談室 part121 [無断転載禁止]©2ch.net
964 :935[sage]:2016/01/23(土) 00:54:21.22 ID:M1o1eQTV - >>956を見てハッとしました。たぶん、いや確実に今書いてるコードは糞なんだと思います。
この糞コードを書いたときの流れはこんな感じでした。 クラスもインスタンスもたくさんあってメモリリーク怖いから、とりあえずインスタンス化には スマートポインタshared_ptr使っとこう。 ↓ そういえばクラス関係は 国→県→市→番地 みたいな階層構造になってるんだった。 (左側クラスは右側クラスを複数含む) ↓ じゃあメンバでvector<shared_ptr<class>を持たせよう。 ↓ 逆方向 国←県←市←番地 にものアクセス欲しいな。 ↓ shared_ptrメンバじゃ循環参照になってしまうから、weak_ptrメンバにしとくか。 ↓ weak_ptrいちいちlock()すんのめんどくせー。 ↓ >>935に至る。 まぁ事実まともな設計とか全くしたことない素人なんですが、改めて書き下してみると酷いな・・・
|
- C++相談室 part121 [無断転載禁止]©2ch.net
965 :935[sage]:2016/01/23(土) 00:59:37.64 ID:M1o1eQTV - 今一度足りない頭でクラスの所有関係と各クラスが持つべきメンバについて
考えてみたのですが、こんな感じで合ってるでしょうか? 親クラス(管理側)をP、子クラス(非管理側)をCとして、 @PはCをメンバとして所有する。複数所有したいならvector<C>とする。 ACはPへアクセスする必要があるなら、Pへの参照メンバを持たせる。 BPのvector<C>メンバの並び順をCの内部状態によって変えたいなら、vectorではなくlistにする。 Bが正しいか気になります。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
966 :935[sage]:2016/01/23(土) 01:03:44.65 ID:M1o1eQTV - ここまで考えて思ったのですが、クラスメンバにスマートポインタがあるのは所有関係を
きちんと考えていない、つまり設計が不十分な可能性を疑うべき、ということでしょうか。 >>955さんの >循環参照は機能分割が不十分な事による設計ミスのが多いよ や、>>956さんの >というかshared_ptr使ったコードは高確率で糞コード。 はそういう意味だったんですかね。 そうするとスマートポインタが主として登場すべき場面とは、関数内でテンポラリ的にインスタンスを作り それを他の関数に渡す等のごにょごにょした作業をしたいときなんでしょうかね? なんかレスが多くなってすみませんが、指導していただけると助かります。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
985 :964[sage]:2016/01/23(土) 14:42:34.05 ID:M1o1eQTV - >>967>>968>>970
ありがとうございます。さっそく糞コードを修正します。 いやはやとんでもない勘違いをしていた・・・
|