【问题标题】:Declare reference to class as class member声明对类的引用作为类成员
【发布时间】:2015-05-27 10:42:27
【问题描述】:

我想声明一个对类的引用,就像指向类的指针一样,作为它自己的成员变量。以下是我编写的代码,但我现在不知道如何进一步创建此类的对象,因为即使我编写默认构造函数或构造函数来仅初始化 var,编译器也会始终出错。

class Test2
{
private:
    Test2& testRef;
    int var;

public:
    Test2( int x, Test2 testObj ) : var( x ), testRef( testObj )
    {

    }
};

我需要进一步创建此类对象,或者根本不可能这样做。如果不可能,编译器为什么不简单地给出一个错误说你不能引用自己的类

【问题讨论】:

  • @wonkorealtime 这里不需要我故意不想要任何优化。
  • 我认为您需要重新考虑项目的结构,因为在该类中引用您的类可能会在您的进一步开发中导致一些问题...
  • @WojciechFrohmberg 我只想知道如果是/否是否可以这样做,那么为什么是/否。
  • 这不是关于优化,而是看这里:cpp.sh/9b2c。您希望它始终初始化包含的引用。
  • testObj 的生命周期仅在构造函数期间持续存在,因此它将在 ctor 完成时被销毁。将其更改为Test2& 会很好,我想您的问题可以简化为“第一个对象在哪里”。事实证明,您可以通过多种方式进行调整,例如,将任意指针重新解释为 Test2*。 @wonkorealtime 在上面给出了更多合理的解决方案。所以编译器不会阻止你。

标签: c++ class object reference


【解决方案1】:

您尝试将对象的临时副本传递给引用。 如果在构造函数中传递引用,就可以了:

Test2( int x, Test2& testObj ) : var( x ), testRef( testObj )
{

}

附加问题:您需要参考非 const 吗? 如果不修改对象,最好使用 const 引用:

class Test2
{
  private:
    const Test2& testRef;
  public:
    Test2( int x, const Test2& testObj ) : var(x), testRef(testObj) {}
};

私人: 测试2& 测试参考; 整数变量;

公开: Test2(int x,Test2 testObj):var(x),testRef(testObj) {

}

};

此外,您应该按照与声明的顺序相同的顺序进行初始化:

Test2(int x, const Test2& testObj) : testRef(testObj), var(x) {}

【讨论】:

  • 这里的问题是首先作为引用Test2& testObj 传递的对象是如何创建的。
  • 喂!这是正确的。然后把我的回答当成一个评论。
  • @MikeSeymour 只要它在您将其传递给构造函数之前就存在,这就是我想知道的如何创建第一个对象。
  • @Krishna_Oza:对不起,我没有注意到引用是相同的类型。忽略我的(已删除)评论。我猜第一个对象必须引用它自己,因为你已经强制引用某些东西并且没有其他东西可以引用。
【解决方案2】:

如果你有一个引用成员,你必须在所有的构造函数中初始化它,因为一个引用必须被初始化。甚至你的默认构造函数。由于您创建的此类的第一个对象将没有其他可以引用的对象,因此您必须将其引用到自身。例如:

Test2() :testRef(*this) {}

【讨论】:

  • 在 C++ 中这样做是合法的
  • 我认为你的答案是我可以创建此类的第一个对象的唯一可能方法,无论是否分配其他成员变量。
  • @Krishna_Oza:据我所知,是的,这是合法的。我从未见过任何相反的事情,我无法让任何编译器抱怨它。
  • 还有一个关于Test2() :testRef(*this) 用法的问题,即使对象尚未完全构造,如何使用this 也是有效的。
  • @Krishna_Oza:除了说明显而易见的问题外,不知道如何回答。因为语言允许。为什么不应该 this 有效?到构造函数启动时,对象的地址就已经知道了,那为什么程序员不能获得这些信息呢?
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多