2012-02-15 58 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); 
} 

请注意,由于上述优化,这可能是一个过早的优化错误。