2013-01-13 40 views
0

我在使用C++中的指針有問題,我無法弄清楚它是什麼;C++無法使指針工作

我有一個類叫做LectureNode:

class LectureNode 
{ 
public: 
Lecture *LecturePtr; 

LectureNode(Lecture lec) 
{ 
    LecturePtr = &lec; 
} 
}; 

這個類的構造函數工作得很好。 我有另一個類:

class LectureForest 
{ 
LectureNode *LecNode; 
list<Lecture>::iterator it; 

public: 
LectureForest(list<Lecture> lecs) 
{ 
    Makeset(lecs); 
} 

void Makeset(list<Lecture> lecs) 
{ 
    for(it = lecs.begin(); it != lecs.end(); it++) 
    { 
     LecNode = LectureNode(*it); 
    } 
} 

問題發生在最後一行。 (* it)被傳遞給LectureNode的構造函數,LectureNode創建成功,但是LecNode不指向它,而是調試器說錯了指針。

謝謝。

回答

8

的一個問題,該代碼

LectureNode(Lecture lec) 
{ 
    LecturePtr = &lec; 
} 

存儲一個指針指向一個由值參數,本地。如果稍後使用該指針,則您有未定義的行爲,因爲by-value參數不再存在。


一個合理的解決方案是做

LectureNode(Lecture* const lec) 
    : lecturePtr_(lec) 
{} 

其中

  • 傳遞一個指針,這是當一個指針將被存儲常規(和也解決了UB問題)

  • 使用初始值列表,而不是在構造函數體,這是一個好習慣分配(這是比較一般,在更多的情況下工作,也可以更有效地)

  • 使用統一的命名規範(小寫初始字符都leclecturePtr_ ),併爲數據成員提供了一個通用的後綴約定(最後加下劃線)。


只是在傳球一記,術語「初始化列表」有多種含義。它也指一個大括號初始值列表。神聖標準的構造函數初始值設定項列表是mem初始化程序,但我從未聽說過或看過任何使用該術語的人。

+0

好的,謝謝,我該如何解決? –

+0

只是單挑:不要混淆_initializer list_和_initialization list_。你的意思是後者。另外,可以使用Lecture的參考,這可以保證傳遞的對象實際上不是空指針。 –

+0

如何更改Makeset功能以反映您的解決方案?讓我們說第一個 –