• ベストアンサー

循環参照の問題に関して。

現在設計の段階なのですが、あるクラスが循環参照に陥りそうで実装に踏み切れません。 現在の状況で循環参照の問題が発生するのか、またどのような開発が循環参照の問題になるのか、教えていただきたいと思います。 現在の状況は、 mainにControlというクラスが実体で多重度1で持たれている。 ControlにDeviceというクラスが多重度0..nでポインタでもたれている。 DeviceというクラスはControlというクラスの参照を持つ。 このような状況になっています。 問題の関係はControlとDeviceです。 このような状況に詳しい方がいらっしゃいましたら、回等をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u
  • ベストアンサー率12% (14/116)
回答No.2

コード上は問題ないので、個人的な印象だけ。 このままの設計だと、Control と Device の結合が強すぎるように思います。Device から見て自分が「格納される」オブジェクト(つまり Control)の情報が欲しいというケースはよくありますが、こういう場合は Device が必要とする操作群を別のクラス ControlInfo に切り出して class Control : public ControlInfo { private: std::list<Device*> devices_; }; class Device { private: ControlInfo& info_; }; とかするかな。 #適当に書いてるだけなので、あんまり参考にしないように。

shirousa01
質問者

補足

回答ありがとうございます。 コメントが遅くなってすみません。 現在、koko_u様の意見を参考にして、結合を弱くするためにインターフェイスとしてのクラスを別に定義して、結合を弱くしました。 親の情報が欲しいというのはやはり設計段階で時折、回避できない用件として出てくることですので、今後意見を参考にし、設計を行うように心がけます。

その他の回答 (2)

  • guccii
  • ベストアンサー率31% (14/44)
回答No.3

誘導可能なコンポジッションというだけだと思います。どうしても気になるのなら、前の回答者様のおっしゃるとおり、Controlの中でDeviceが必要とするもののインターフェースを定義してdelegateするか、あるいは、FactoryMethodを用意して参照の設定を隠蔽しておけば、特に問題になることはないと思われます。この場合には、関係が固定的で、一般化の必要性もあまり感じとれませんから、それほどのこともなさそうに思えますが...。

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.1

このような状態を循環参照というかちょっと微妙なきがしますが・・・ 要はこんな感じなのですよね? class Control { std::list <Device *> m_device; ... }; class Device { Control &m_control; ... }; とくに問題ないと思うのですが・・・ インスタンスの作成に関して危惧されているのでしょうか?

shirousa01
質問者

お礼

回等ありがとうございます。 まさにその状況です。 参照が循環する情況に不安を覚えています。 なるべくこのような状況は避けてきたので、初めて回避できない状況におかれて、実装が進んだ後に、この状況で私の対処できない問題が発生してしまいますと、対応に時間をとられてしまいますから。

関連するQ&A

専門家に質問してみよう