2017-06-03 72 views
-2

我有點困惑,當涉及到指針和c + +中的引用。返回對象從一個函數,如鏈接列表中的指針

我知道只有指針可以爲null。因此,對於我的自定義鏈表類,我有:

ObjectNode* head; // Pointer to the first item of the list 
ObjectNode* last; // Pointer to the last item of the list 

同樣的,在我的ObjectNode課,我有

SimObject object; // The actual Object (cannot be null) 
ObjectNode* next; // Pointer to next Node 
ObjectNode* prev; // Pointer to previous Node 

這樣一來,我的未來和prev變量可以爲空,使用

next = null; 

但是,我get方法:

ObjectNode ObjectList::getHead() { 
    return head; 
} 

ObjectNode ObjectList::getLast() { 
    return last; 
} 

這給出了將發生的轉換錯誤。所以我可能誤解了一些重要的東西,我不確定我是如何返回該對象的?

回答

1

你應該返回一個ObjectNode *

記住,這是SimObject它不能爲空,ObjectNode *其實可以爲空,在這種情況下,有存在沒有實際的節點。來自GetHead的空返回值表示列表爲空。

當您使用GetHead時,調用它的代碼需要檢查返回的值是否爲null。

如果你想獲得對象用頭指了指,然後你必須要麼做一個函數,該函數或採取所返回的指針,檢查它是否不爲空,則獲取對象:

ObjectNode *head = list.GetHead(); 
if(head != null) 
{ 
    SimObject s = head->object; 
} 

但是,您需要仔細考慮其他代碼將如何訪問列表,空列表意味着什麼,以及如果調用代碼沒有做到正確的事情會變得多麼脆弱(例如,如果調用代碼不會不檢查GetHead是否返回null)。看看std :: list是如何工作的,然後在你自己的列表中複製這個功能(只有你需要的位)。那麼你有最好的情況下,你可以交替地放入你的列表或std ::列表。

例如而不是「GetHead()」使用「begin()」,然後設置「end()」返回null,並重載ObjectNode *的++運算符,使其成爲ObjectNode :: next。然後你可以遍歷您的自定義列表:

for(auto i = mylist.begin(); i != mylist.end(); i++) 
{ 
} 

的相同的std ::列表

+0

啊對我看到 我什至沒有考慮使用具有給類以外的檢查空值會是次優 感謝您向我明確解釋 – Astantos