2012-07-18 34 views
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) 

回答

3

你需要一個構造函數的初始化列表中初始化參考成員。即使構造函數的主體已經太晚了,因爲成員已經被初始化了,並且不能被改變。

在您的代碼中,您正在使用(編譯器提供的)默認構造函數,然後在構造對象後嘗試設置引用。

試試這個:

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

int main() 
{ 
    A a; 

    S* s=new S(a); 
... 
+0

omg謝謝:) – 2012-07-18 16:46:41

+0

但後來即使我重載構造函數如何在對象被構造之前使用它? – 2012-07-18 16:48:21

+0

我不明白你的問題。在構建之前,您無法使用對象。 – jwismar 2012-07-18 16:50:05

2

它不工作,因爲你正在試圖分配東西基準部件(其中,當然,不影響引用本身,而是引用對象)。你不是初始化你的代碼中的引用。引用只能在它們「出生」的那一刻被初始化,它們的初始化不能被推遲。

當您執行new S時,您要求編譯器使用編譯器生成的默認構造函數S。由於編譯器不知道如何初始化引用成員a,因此無法生成S的默認構造函數。 C++中的引用不能被初始化,它們不能被默認初始化,並且它們被初始化。總是必須明確提供特定的初始化程序。

不幸的是,在C++ 89/C++ 03中,沒有辦法爲動態分配的struct S(在您的代碼中定義)執行此操作。你必須爲此提供你自己的構造函數。

在C++ 11可以使用均勻initailization語法

S *s = new S { a }; 

這將新分配的對象的S::a構件附接至a