0

C++ では、その所有者を指すオブジェクトへの参照がありますが、構築が完了していないため、含まれているクラスの構築中にポインターを設定できません。だから私はこのようなことをしようとしています:

class A {
   public:

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

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

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

ありがとう

4

2 に答える 2

6

これを試して:

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++ でコンパイルされます。

于 2009-11-02T19:32:19.893 に答える
0

C++ では、その所有者を指すオブジェクトへの参照がありますが、構築が完了していないため、含まれているクラスの構築中にポインターを設定できません。

ポインタは問題なく格納できます。

親インスタンスがその時点で完全に初期化されていない可能性があるため、できないことは、B のコンストラクターのポインターを介して A のメンバー/メソッドにアクセスしようとすることです。

#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 を出力しますが、これは脆弱すぎて依存できません。

于 2009-11-02T22:46:35.763 に答える