サイクル[C ++]クラス充填ピットを参照

  最近問題、循環参照が発生しました。クラスAがクラスBのオブジェクトを定義し、クラスBはまた、オブジェクトのクラスAで定義されるその

  間違った設定モード:直接の新しい方法、問題は無限ループを生じ

// ああ
クラスB;
クラスA 
{ 
パブリック
    A(); 
    A();
プライベート
    B * B; 
}。

// A.cpp用 
の#include " " 
の#include " Bhの" 

A :: A()
{ 
    B = 新しいB(); 
} 

A ::A()
{ 
    削除B。
    B = nullptr。
}

 

// Bhの
クラスA;
クラスB 
{ 
パブリック
    B(); 
    B();
プライベート
    A * ; 
}。

// B.cpp用 
の#include " Bhを" 
の#include " " 

B :: B()
{ = 新しいA(); 
} 

B ::B()
{ 
    削除します
    A = nullptr; 
}

  本当に問題があることを確認するために、次のように書いて、話します。しかしトラブルは、あなたがそれを変更する方法がわからないということです。

  ここでは、エレガントに、この問題を解決する方法を、と言います。

  建設の正しい方法:登録した構成と同様の方法を使用します

// ああ
、クラスB、
 クラスA 
{ 
パブリック
    A();
    A();
 プライベート
    B * B; 
}; 

// A.cppの 
書式#include " AH " 
の#include " BH " 

A :: A()
{ 
    B = 新しい新B、
    B - >セットA(); //はどこ方法レジスタクラスBの構成と同様、フォーカス、描画
} 

::()
{ 
    削除Bを、
    B = nullptr A。
}
// のBHの
クラスA、
 クラスB 
{ 
パブリック
    B(); // 描画キーは、達成するために必要とされていないBを();
     無効セットA(A * X);
 プライベート
    A * A; 
}; 

// B.cpp 
#include " BH " 
の#include " AH " 

ボイド B ::セットA(A * X)
{ 
    A = X; 
}

おすすめ

転載: www.cnblogs.com/LampsAsarum/p/12100816.html