【问题标题】:how to get a reference to the instance which created 'this'?如何获取对创建“this”的实例的引用?
【发布时间】:2021-09-17 20:30:20
【问题描述】:
#include <iostream>

struct Class1 {
    Class1(int var1_);
    int var1;
};

Class1::Class1(int var1_)
    : var1(var1_)
{
    //how to get a referecnce to the instance of class2 ???
}

struct Class2 {
    Class1 instance1;
    Class2(int var);
};

Class2::Class2(int var)
    : instance1(Class1(var))
{
}

int main()
{
    Class2 instance2(3);
}

在主函数中,我创建了一个 Class2 的实例。 Class2 有 Class1 的成员,所以 Class2 的构造函数调用 Class1 的构造函数。

在 Class1 的构造函数中,我想获取对 Class1 实例的引用,即创建 Class2 实例的实例。如果不将地址传递给构造函数,如何实现这一点? 'this' 指的是刚刚创建的 Class2 实例,而不是导致 Class2 实例创建的 Class1 实例。 任何输入表示赞赏! :)

【问题讨论】:

标签: c++ lambda constructor


【解决方案1】:

你不能。

只有指向当前对象的指针被隐式传递到this。任何其他元素都必须显式传递。构造函数Class1::Class1(int var1_) 不能隐藏Class 2 对象的引用,因为它可能是在Class2 上下文之外创建的。

如果您希望能够使用对 Class2 对象的引用,则必须显式传递它:

Class1::Class1(int var1_, Class2& parent);

及以后:

Class2::Class2(int var): instance1(Class1(var, *this))

但要注意:在Class1 ctor 内部,您可以存储Class2 对象的地址,但不要使用它,因为它尚未完全构造。

【讨论】:

  • 感谢四位您的回答!我也是这么想的,但是在另一个论坛上,有人告诉我使用 lambda 表达式和捕获变量可以得到这样一个隐藏的引用。但无论如何,将地址传递给构造函数也很好,即使它有点破坏代码。
  • @Simon:lambda 只是一个匿名函数。这意味着您可以使用原始 ctor 创建者对象来使用 factory(无论是 lambda 函数还是其他),并且该工厂可以 inject 创建者进入Class1 对象。但它不能在Class1 ctor 中使用,除非它是显式参数。
  • @Simon - 像您描述的 Lamba 本质上是一个匿名数据结构,其中包含捕获的指针或对 Class2 实例的引用。由于该 lambda 需要传递给 Class1 的构造函数,因此该技术只是以更复杂的方式传递 Class2 的地址。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多