C ++指的是正在构造的对象

时间:2009-11-02 19:23:40

标签: c++ reference construction

在C ++中,我引用了一个想要指向其所有者的对象,但是我无法在包含类的构造期间设置指针,因为它没有完成构造。所以我试着做这样的事情:

class A {
   public:

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

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

有没有办法确保B总是用A *初始化而没有A拿着指向B的指针?

由于

2 个答案:

答案 0 :(得分: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 ++下编译。

答案 1 :(得分: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,但这太脆弱而无法依赖。