在C ++我不得不想要重新指向其所有者的对象的引用,但由于其没有做过构建我不能包含类的建设过程中设置的指针。所以,我试图做这样的事情:

class A {
   public:

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

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

有一种方法,以确保总是乙得到无A保持一个指针到B与A *初始化?

由于

有帮助吗?

解决方案

尝试这种情况:

class A;

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

private:
  A* a;
};

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

private:
  B b;

};

由于B处于完全包含的,它必须首先声明。它需要一个指向A,所以你必须声明B之前转发-声明。

此代码下的克++更多或更少的电流版本编译。

其他提示

  

在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,但就是太脆弱依赖。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top