電子書籍の厳選無料作品が豊富!

現在設計の段階なのですが、あるクラスが循環参照に陥りそうで実装に踏み切れません。
現在の状況で循環参照の問題が発生するのか、またどのような開発が循環参照の問題になるのか、教えていただきたいと思います。

現在の状況は、
mainにControlというクラスが実体で多重度1で持たれている。
ControlにDeviceというクラスが多重度0..nでポインタでもたれている。
DeviceというクラスはControlというクラスの参照を持つ。

このような状況になっています。
問題の関係はControlとDeviceです。

このような状況に詳しい方がいらっしゃいましたら、回等をお願いいたします。

A 回答 (3件)

コード上は問題ないので、個人的な印象だけ。



このままの設計だと、Control と Device の結合が強すぎるように思います。Device から見て自分が「格納される」オブジェクト(つまり Control)の情報が欲しいというケースはよくありますが、こういう場合は Device が必要とする操作群を別のクラス ControlInfo に切り出して

class Control : public ControlInfo {

private:
std::list<Device*> devices_;
};

class Device {

private:
ControlInfo& info_;
};

とかするかな。
#適当に書いてるだけなので、あんまり参考にしないように。

この回答への補足

回答ありがとうございます。
コメントが遅くなってすみません。

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

補足日時:2007/05/24 21:06
    • good
    • 0

誘導可能なコンポジッションというだけだと思います。

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

このような状態を循環参照というかちょっと微妙なきがしますが・・・



要はこんな感じなのですよね?

class Control
{
std::list <Device *> m_device;
...
};

class Device
{
Control &m_control;
...
};

とくに問題ないと思うのですが・・・

インスタンスの作成に関して危惧されているのでしょうか?
    • good
    • 0
この回答へのお礼

回等ありがとうございます。
まさにその状況です。

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

お礼日時:2007/01/08 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!