C ++:将构造对象的引用传递给构造成员对象?

时间:2011-05-06 00:12:40

标签: c++ inheritance reference

好的,请考虑以下课程:

class Object
{
public:
    // Constructor
    Object() : 
        [Initialization List]
    {
        ...
    }
    ...
};

class Container
{
public:
    Object A;
    Object B;

    ....

    Container() :
        [Initialization List]
    {
    }
};

我想向对象提供[访问Container及其成员]。

我的第一个想法是以某种方式将对当前Container对象的引用传递给Objects的构造函数。但我无法弄清楚如何做到这一点。

我用“这个”搞砸了,但我没有得到任何有用的东西。我试过这样的事情:

class Object
{
public:
    Container& c

    // Constructor
    Object(Container& c_) : 
        c(c_)
    {
        ...
    }
    ...
};

class Container
{
public:
    Object A;
    Object B;

    ....

    Container() :
        A(Object(this))
        B(Object(this))
    {
    }
};

我最终的目标是能够从对象A的成员方法中访问对象B.

有没有人对如何更接近我正在寻找的东西有任何见解?

谢谢!

3 个答案:

答案 0 :(得分:5)

UB 不一定要在初始化程序列表中使用this,尽管需要小心,并且您的代码完全有效小修改。

class Container;
class Object
{
public:
    Container& c

    // Constructor
    Object(Container& c_) : 
        c(c_)
    {
    }
};

class Container
{
public:
    Object A;
    Object B;

    Container() :
        A(Object(*this))
        B(Object(*this))
    {
    }
};

this是一个指针,你想要一个引用,一个简单的去引用就可以了。这是完全合法且定义的代码。不允许通过指针访问任何成员数据或函数,因为这些成员数据或函数在init列表完成之前可能还不存在。但它肯定允许在它的初始化列表中获取对象的指针或引用并传递它。

答案 1 :(得分:1)

如何使用指针? 修改:修复代码以避免初始化列表中的this

class Container;

class Object
{
public:
    Container *c;

    // Constructor
    Object(Container *c_) : 
        c(c_)
    {
    }
};

class Container
{
public:
    Object *A, *B;

    Container()
    {
        A = new Object(this);
        B = new Object(this);
    }
};

答案 2 :(得分:-1)

您不应该在初始化程序中为您正在构建其实例的类的成员传递this,但您可以稍后传递它,因此有两种简单的方法解决您的问题

  • 在构造函数体内的对象(A.setContainer(*this))上使用setter
  • 制作A和B指针,将它们初始化为NULL并在构造函数体内执行A = new Object(this)