任何人都知道如何在动态分配的结构中初始化引用? 或者为什么这不起作用?
#include <stdio.h>
#include <stdlib.h>
class A
{
};
struct S
{
A& a;
};
int main()
{
A a;
S* s=new S;
s->a=a;
printf("a addr:%p\n", &a);
printf("s->a addr:%p\n", &(s->a));
delete s;
return 0;
}
输出:
a addr:0x7fff95b65aaf
s->a addr:(nil)
答案 0 :(得分:3)
您需要在构造函数的初始化列表中初始化引用成员。甚至构造函数的主体也为时已晚,因为该成员已经初始化,并且无法更改。
在您的代码中,您正在使用(编译器提供的)默认构造函数,然后在构造对象后尝试设置引用。
试试这个:
struct S
{
S(A& a_) : a(a_){}
A& a;
};
int main()
{
A a;
S* s=new S(a);
...
答案 1 :(得分:2)
它不起作用,因为您正在尝试将分配给引用成员(当然,这不会影响引用本身,而是影响引用的对象)。您不是在代码中初始化引用。引用只能在它们“诞生”的那一刻初始化,它们的初始化不能推迟以供日后使用。
执行new S
时,您要求编译器使用编译器生成的S
默认构造函数。无法生成S
的默认构造函数,因为编译器不知道如何初始化引用成员a
。 C ++中的引用不能保持未初始化,不能默认初始化,并且它们是初始化的值。必须明确提供特定的初始化程序。
不幸的是,在C ++ 89 / C ++ 03中,对于动态分配的struct S
(如代码中所定义),无法做到这一点。你必须为此提供自己的构造函数。
在C ++ 11中,您可以使用统一的初始化语法
S *s = new S { a };
将新分配的对象的S::a
成员附加到a
。