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

C++: Passing reference of constructing object to constructed member objects?

本文关键字:成员对象 对象 C++ 引用      更新时间:2023-10-16

好的,考虑以下类:

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

我想为对象提供[对容器及其成员的访问]。

我的第一个想法是以某种方式将对当前容器对象的引用传递给对象的构造函数。 但是我不知道该怎么做。

我搞砸了"这个",但我没有得到任何有效的东西。 我尝试了这样的事情:

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。

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

谢谢!

在初始值设定项列表中使用 this 不一定是 UB 坏事,尽管需要小心,并且您的代码只需稍作修改即可完全有效。

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 列表完成之前可能根本不存在。但是绝对允许在初始值设定项列表中获取指向对象的指针或引用并将其传递。

只使用指针怎么样?编辑:修复代码以避免在初始值设定项列表中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);
    }
};

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

  • 在构造函数主体中的对象(A.setContainer(*this))上使用二传手
  • 创建 A 和 B 指针,将它们初始化为NULL并在构造函数的主体中执行A = new Object(this)