
現在設計の段階なのですが、あるクラスが循環参照に陥りそうで実装に踏み切れません。
現在の状況で循環参照の問題が発生するのか、またどのような開発が循環参照の問題になるのか、教えていただきたいと思います。
現在の状況は、
mainにControlというクラスが実体で多重度1で持たれている。
ControlにDeviceというクラスが多重度0..nでポインタでもたれている。
DeviceというクラスはControlというクラスの参照を持つ。
このような状況になっています。
問題の関係はControlとDeviceです。
このような状況に詳しい方がいらっしゃいましたら、回等をお願いいたします。
No.2ベストアンサー
- 回答日時:
コード上は問題ないので、個人的な印象だけ。
このままの設計だと、Control と Device の結合が強すぎるように思います。Device から見て自分が「格納される」オブジェクト(つまり Control)の情報が欲しいというケースはよくありますが、こういう場合は Device が必要とする操作群を別のクラス ControlInfo に切り出して
class Control : public ControlInfo {
private:
std::list<Device*> devices_;
};
class Device {
private:
ControlInfo& info_;
};
とかするかな。
#適当に書いてるだけなので、あんまり参考にしないように。
この回答への補足
回答ありがとうございます。
コメントが遅くなってすみません。
現在、koko_u様の意見を参考にして、結合を弱くするためにインターフェイスとしてのクラスを別に定義して、結合を弱くしました。
親の情報が欲しいというのはやはり設計段階で時折、回避できない用件として出てくることですので、今後意見を参考にし、設計を行うように心がけます。
No.3
- 回答日時:
誘導可能なコンポジッションというだけだと思います。
どうしても気になるのなら、前の回答者様のおっしゃるとおり、Controlの中でDeviceが必要とするもののインターフェースを定義してdelegateするか、あるいは、FactoryMethodを用意して参照の設定を隠蔽しておけば、特に問題になることはないと思われます。この場合には、関係が固定的で、一般化の必要性もあまり感じとれませんから、それほどのこともなさそうに思えますが...。No.1
- 回答日時:
このような状態を循環参照というかちょっと微妙なきがしますが・・・
要はこんな感じなのですよね?
class Control
{
std::list <Device *> m_device;
...
};
class Device
{
Control &m_control;
...
};
とくに問題ないと思うのですが・・・
インスタンスの作成に関して危惧されているのでしょうか?
回等ありがとうございます。
まさにその状況です。
参照が循環する情況に不安を覚えています。
なるべくこのような状況は避けてきたので、初めて回避できない状況におかれて、実装が進んだ後に、この状況で私の対処できない問題が発生してしまいますと、対応に時間をとられてしまいますから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
ボタンのオーナードローについて
-
windowプログラム ピクチャー...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
MFC モードレスDlgについて
-
イベントにAddHandlerされてい...
-
【C++】vectorについて
-
IncludeではなくClassで宣言す...
-
C++/CLIからC++の呼び出しで例外
-
エディットコントロールでEnter...
-
VB.NETでのEnumの使用について
-
Delphi6でVB.NETで作成のDLL呼出
-
DateAdd関数について質問があり...
-
個々の関数について継承してい...
-
FriendとPublicの違い。。。
-
enumの継承?
-
クラスの初期化方法の違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
イベントにAddHandlerされてい...
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
クラスのアドレスを引数として...
-
MFCアプリのコマンドラインでパ...
-
エディットコントロールのイベ...
-
ボタンのオーナードローについて
-
正規表現 [^/]+ の意味を教えて
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
C# 別プロジェクトのフォームを...
-
オーバーライド関数の呼び出し...
-
MFCのCListCtrlでスクロールを検出
おすすめ情報