C++ 将对类的引用声明为类成员

C++ 将对类的引用声明为类成员,c++,class,object,reference,C++,Class,Object,Reference,我想声明一个类的引用,类似于类的指针,作为它自己的成员变量。下面是我编写的代码,但我现在被困在如何进一步创建这样一个类的对象上,因为即使我编写了默认构造函数或只初始化var的构造函数,编译器也总是会给出错误 我需要进一步做什么来创建此类对象,或者根本不可能这样做。如果不可能,为什么编译器会简单地给出一个错误,告诉您不能引用自己的类 尝试将对象的临时副本传递给引用。 如果在构造函数中传递引用,则可以: Test2( int x, Test2& testObj ) : var( x ), t

我想声明一个类的引用,类似于类的指针,作为它自己的成员变量。下面是我编写的代码,但我现在被困在如何进一步创建这样一个类的对象上,因为即使我编写了默认构造函数或只初始化var的构造函数,编译器也总是会给出错误


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

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

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

}
附加问题:您是否需要参考非常量? 如果不修改对象,则最好对其使用常量引用:

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

公众: test2intx,test2testobj:varx,testRef-testObj {

})

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

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

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

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

}
附加问题:您是否需要参考非常量? 如果不修改对象,则最好对其使用常量引用:

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

公众: test2intx,test2testobj:varx,testRef-testObj {

})

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

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

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

Test2() :testRef(*this) {}

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

Test2() :testRef(*this) {}

@wonkorealtime这在这里不是必需的,我故意不想要任何优化。我认为你需要重新考虑你的项目结构,因为在该类中引用你的类可能会在你的进一步开发中引起一些问题…@WojciechFrohmberg我只想知道是否有可能这样做如果是/否,那么为什么是/否。这与优化无关,但请看这里:。您希望它始终初始化包含的引用。testObj的生存期仅在构造函数期间持续,因此当构造函数完成时,它将被销毁。将其更改为Test2&会很好,我想您的问题会减少到第一个对象的位置。事实证明,有很多方法可以调整,例如,将任意指针重新解释为Test2*@wonkorealtime给出了以上更合理的解决方案。所以编译器不会阻止你。@wonkorealtime这在这里不是必需的,我故意不想进行任何优化。我认为你需要重新考虑项目的结构,因为在该类中引用你的类可能会在你的进一步开发中引起一些问题…@WojciechFrohmberg我只是想知道这是否可行做或不做如果是/否,那么为什么是/否。这不是关于优化,但请看这里:。您希望它始终初始化包含的引用。testObj的生存期仅在构造函数期间持续,因此当构造函数完成时,它将被销毁。将其更改为Test2&会很好,我想您的问题会减少到第一个对象的位置。事实证明,有很多方法可以调整,例如,将任意指针重新解释为Test2*@wonkorealtime给出了以上更合理的解决方案。因此编译器不会阻止您。这里的问题是,作为引用Test2和testObj传递的对象首先是如何创建的。Ho!这是正确的。然后只把我的答案当作一句话。“只要你把它传给构造函数,只要它存在,我就想知道如何创建第一个对象。”MikeSeymour:对不起,我没有注意到引用是同一个类型。忽略我删除的评论。我猜第一个对象必须引用它自己,因为你已经强制引用某个东西,而没有其他东西可以引用。这里的问题是,作为引用Test2和testObj传递的对象首先是如何创建的。嗬!这是正确的。然后只把我的答案当作一句话。“只要你把它传给构造函数,只要它存在,我就想知道如何创建第一个对象。”MikeSeymour:对不起,我没有注意到引用是同一个类型。忽略我删除的评论。我猜第一个对象必须引用它自己,因为你已经强制引用一个对象
我想你的答案是我创建此类类的第一个对象的唯一可能的方法,无论是否分配其他成员变量。@Krishna_Oza:据我所知,是的,这是合法的。我从未见过任何与此相反的东西,我也不能让任何编译器对此抱怨。关于Test2的用法,还有一个问题:testRef*即使在对象还没有完全构造的情况下,为什么在这里使用它也是有效的。@Krishna_Oza:除了说明显而易见的问题外,不知道如何回答这个问题。因为语言允许。为什么这不是有效的?当构造函数启动时,对象的地址就已经知道了,那么为什么程序员不能获得这些信息呢?在C++中这样做合法吗?我想你的答案是我创建此类类的第一个对象的唯一可能的方法,无论是否分配其他成员变量。@Krishna_Oza:据我所知,是的,这是合法的。我从未见过任何与此相反的东西,我也不能让任何编译器对此抱怨。关于Test2的用法,还有一个问题:testRef*即使在对象还没有完全构造的情况下,为什么在这里使用它也是有效的。@Krishna_Oza:除了说明显而易见的问题外,不知道如何回答这个问题。因为语言允许。为什么这不是有效的?当构造函数启动时,对象的地址是已知的,那么为什么程序员不能获得这些信息呢?