質問

は、C ++では、私は、その所有者に戻って指すように望んでいるオブジェクトへの参照を持っているが、その建設は行われないので、私は含むクラスの構築時にポインタを設定することはできません。だから私はこのような何かをしようとしています:

class A {
   public:

     A() : b(this) {}
   private:
     B b;
};

class B {
   public:
     B(A* _a) : a(_a) {}
   private:
     A* a;
};

常にBへのポインタを保持することなくA *に初期化されるBを確保する方法はありますか?

おかげ

役に立ちましたか?

解決

これを試してください:

class A;

class B {
public:
  B(A *_a) : a(_a) {};

private:
  A* a;
};

class A {
public:
  A() : b(this) {};

private:
  B b;

};
Bは、Aに完全に含まれているので、

は、最初に宣言されなければなりません。それは、Aへのポインタを必要とするので、あなたはBを宣言する前に、A-宣言転送する必要があります。

このコードは、++ Gの多かれ少なかれ現在のバージョンでコンパイルします。

他のヒント

  

C ++では、私は戻って、その所有者にポイントするように望んでいるオブジェクトへの参照を持っているが、その建設は行われないので、私は含むクラスの構築時にポインタを設定することはできません。

あなたは大丈夫ポインタを格納することができます。

親インスタンスが完全時点で初期化されない場合がありますので、

あなたはどうすることができないことは、Bのコンストラクタ内のポインタ経由のメンバー/メソッドを取得しようとすることです。

#include <iostream>

class Y;

class X
{
    Y* y;
public:
    X(Y* y);
};

class Y
{
    X x;
    int n;
public:
    Y(): x(this), n(42) {}
    int get_n() const { return n; }
};

X::X(Y* p): y(p)
{
    //Now this is illegal:
    //as it is, the n member has not been initialized yet for parent
    //and hence get_n will return garbage
    std::cout << p->get_n() << '\n';
}

int main()
{
    Y y;
}

あなたはY内のメンバーを中心に切り替えるようにしたので、nはXのコンストラクタが42を印刷し、それが依存しすぎて壊れやすいです。、最初に初期化になるだろう場合は、

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top