在动态分配的结构中初始化引用

时间:2012-07-18 16:43:22

标签: c++

任何人都知道如何在动态分配的结构中初始化引用? 或者为什么这不起作用?

#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)

2 个答案:

答案 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