2

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

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

2 回答 2

3

您需要在构造函数的初始化程序列表中初始化引用成员。连构造函数的主体都来不及了,因为成员已经被初始化了,无法更改。

在您的代码中,您正在使用(编译器提供的)默认构造函数,然后在构造对象后尝试设置引用。

尝试这个:

struct S
{
    S(A& a_) : a(a_){} 
    A& a;
};

int main()
{
    A a;

    S* s=new S(a);
...
于 2012-07-18T16:45:31.403 回答
2

它不起作用,因为您试图某些内容分配给引用成员(当然,这不会影响引用本身,而是影响被引用的对象)。您没有在代码中初始化引用。引用只能在它们“诞生”的那一刻被初始化,它们的初始化不能推迟到以后。

当你这样做时new S,你要求编译器使用编译器生成的默认构造函数SS无法生成默认构造函数,因为编译器不知道如何初始化引用成员a。C++ 中的引用不能未初始化,不能默认初始化,也不能进行值初始化。始终必须明确提供特定的初始化程序。

struct S不幸的是,在 C++89/C++03 中,对于动态分配的(如您的代码中定义的)没有办法做到这一点。您必须为此提供自己的构造函数。

在 C++11 中,您可以使用统一的初始化语法

S *s = new S { a };

S::a这会将新分配对象的成员附加到a.

于 2012-07-18T16:50:28.210 回答