6

たとえば、2つのクラスがあります

class Foo;
class Bar;

class Foo {
  const Bar &m_bar;
  ...
};

class Bar {
  const Foo &m_foo;
  ...
};

Letfooは のオブジェクトでFoobarは のオブジェクトですBarfoo作成/初期化する方法 (通常または「ハッキング」)はありますか?またbar、それらのメンバーが相互に参照されます ( is and is 'foo' を意味します)。m_barm_foofoo.m_barbarbar.m_foo

と に任意のメンバーを追加しFooたりBar、それらの親を追加したり、それらをテンプレートにしたりすることができます。

4

2 に答える 2

6

fooとのリンケージは何barですか? それらに外部リンケージがある場合は、次のように記述できます。

extern Foo foo;
extern Bar bar;

Foo foo( bar );
Bar bar( foo );

(ここでは、パラメーターへの参照を設定するのはコンストラクターであると想定しています。)

もちろん、これは名前空間のスコープと静的な有効期間を想定しています (ただし、匿名の名前空間は問題ありません)。

それらがクラス メンバーである場合は、どちらも問題ありません。

class Together
{
    Foo foo;
    Bar bar;
public:
    Together() : foo( bar ), bar( foo ) {}
};

それらがローカル変数(バインディングなし)である場合、解決策はないと思います。

編集:

実際には、ローカル変数には簡単な解決策があります。それらをメンバーとして持つローカル クラスを定義し、それを使用するだけです。

于 2013-09-13T11:27:10.763 に答える
0

オブジェクトバーを作成するにはFooが必要であり、その逆も同様であるため、問題を正しく理解している場合、これは機能しません。References ではなく Pointer を使用してください。両方のオブジェクトを別々に作成してから、Bar を Foo に、Foo を Bar に設定できます。

class Foo
{ 
public:
   Foo();
   void setBar( const Bar* bar ){ _bar = bar; }

private:
   const Bar* _bar;
}
// class Bar analog to Foo


void xxx:something(void)
{
   Foo* f = new Foo;
   Bar* b = nee Bar;
   f->setBar(b);
   b->setBar(f);
   ...
}
于 2013-09-13T12:18:49.777 に答える