2012-02-15 56 views
1

我有這兩個功能困惑返回引用

int FEL::enqueue(Event& new_event){ 
    getting a reference of an event and add it to an Event array, defined as "Event *event_list" 
} 

Event FEL::dequeue(){ 
    Event old_root = event_list[0]; 
    event_list[0] = event_list[--event_index]; 
    resort_heap(0); 
    return old_root; 
} 

它的偉大工程,但我想修改這個在出列功能有更好的表現。 由於出隊函數返回事件,我想如果我只是返回事件的引用而不是整個事件結構可能會更好。

如何更改退出函數的返回類型以返回事件的參考? 我想我可以做這樣的事情來返回一個指針,但我該如何返回事件的參考(&)?

Event* FEL::dequeue(){ 
    Event *old_root = &event_list[0]; 
    event_list[0] = event_list[--event_index]; 
    resort_heap(0); 
    return old_root; 
} 
+3

那麼,你不能返回你覆蓋或刪除的東西的引用。這應該如何工作?返回副本似乎是最明智的方法。或者只是使用標準庫容器。 – 2012-02-15 22:38:11

回答

0

返回一個指針是行不通的,因爲你修改event_list[0]old_root是一個指針,它指向的對象,所以它會指向新的價值,而不是舊值。至於返回引用,你也不能,因爲返回的值必須是類的成員(或類的成員的元素等),如果你這樣做,你會得到新的值,不是老的。

如果你想返回舊值,你唯一的解決辦法是按值返回。儘管如此,它可能並不像你想象的那麼糟糕。大多數編譯器可以應用返回值優化,這意味着該對象不被複制。而且,如果對象包含任何分配的存儲,它可以從C++ 11上的移動語義中受益。

編輯:對不起,當然有另一種方法來做到這一點。

void FEL::dequeue(Event *old){ 
    *old = event_list[0]; 
    event_list[0] = event_list[--event_index]; 
    resort_heap(0); 
} 

請注意,由於上述優化,這可能是一個過早的優化錯誤。