2012-02-15 12 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を返すので、イベント構造全体ではなくイベントの参照を返すだけでよいかもしれないと考えました。

デキュー関数の戻り値の型を変更してイベントの参照を返すにはどうすればよいですか? ポインタを返すためにこのようなことができると思いますが、イベントの参照(&)を返すにはどうすればいいですか?あなたはevent_list[0]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

まあ、上書きしたり削除したりしたものへの参照を返すことはできません。それはどうやって動くのだろう?コピーを返すことは最も合理的なアプローチのようです。または、標準のライブラリコンテナを使用するだけです。 –

答えて

0

は、そのオブジェクトへのポインタであるので、それは、新しい値の代わりに、古い値を指します。参照を返す場合は、返される値がクラスのメンバ(またはクラスのメンバの要素など)でなければならないため、参照を返すことはできません。そうした場合、新しい値が返されます、古いではありません。

古い値を返す場合は、唯一の解決策は値で返すことです。あなたが思うほど悪くないかもしれません。ほとんどのコンパイラは戻り値の最適化を適用できます。つまり、オブジェクトはコピーされません。さらに、オブジェクトに割り当てられたストレージが含まれている場合は、C++ 11のセマンティクスの移動のメリットが得られます。

編集:申し訳ありませんが、もちろんこれを行う別の方法があります。

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

これは、上記の最適化のために間違っていた早すぎる最適化である可能性があることに注意してください。