0

循環を形成する2つのクラスが必要です。どちらにも独自のメンバーがありますが、他のクラスのコピーとともに、この例を考えてみましょう。

class lower; 
class upper{
    int uA;
    lower L;
    upper(){
    uA=0;   
    //how to initialize lower here using lower's constructor 
    }
};

class lower{
    int lA;
    upper U;
    lower(){
    lA=0; 
    //how to initialize upper here using upper's constructor 
   }

};

今度upper Lは main(); に上位オブジェクトが必要です。そして、それのすべての変数をゼロで初期化する必要があります(デフォルトのコンストラクターの場合)が、これらのコンストラクターの循環を処理する方法がわからないため、lower Lアッパー内で 初期化されます

4

2 に答える 2

2

次のようなものを使用できます。

class upper;
class lower{
    friend class upper;
    int lA;
    upper* U;
    void setUpper(upper* u)
    {
        U = u;
    }
    public:

    lower(){
    lA=0; 
    U = 0; 
   }
};

class upper{
    int uA;
    lower* L;
    public:
    upper(lower* l){
    uA=0;   
    L = l;
    l->setUpper(this); 
    }
};

int main()
{
    lower* l = new lower();
    upper* u = new upper(l);
    return 0;
}

必要に応じて、ポインターをクリーンアップするためにデストラクターを追加するか、上部から下部を削除する必要がありますか?

また、データ構造を調査し、循環依存を取り除くことができるかどうかを確認する必要があります。将来的に問題が発生する可能性があります。

于 2012-08-12T20:50:09.763 に答える
1

このように、(KennyTMが言うように、ポインターを使用する必要があります)

class lower; 

class upper
{
    int uA;
    lower* L;
    upper() : uA(0), L(new L)
    {
    }
};

class lower
{
    int lA;
    upper* U;
    lower() : lA(0), U(new U)
    {
    }
};

このコードには多くの問題がありますが、うまくいけばあなたの質問に答えてくれます。

于 2012-08-12T20:44:44.003 に答える