プライオリティ que を作成して、それをテンプレート クラスにしようとしています。ポップすると、型 T を返す必要があります。何も返さない方法や、キューに何もない場合にクラッシュを回避する良い方法はありますか?
3 に答える
ここで予想される動作は、例外をスローすることです。ユーザーは、ポップを試みる前にキューが空であることを確認する必要があります。null を返すこともできますが、型 T が null の値を持たない場合に限ります。それ以外の場合、エラーが発生したため、またはキュー内の次の値が null であったためにこれが返されている場合はあいまいです。
テンプレートは質問とは無関係です。
この状況に対処する一般的な方法がいくつかあります。
- オブジェクトをヒープに格納します。削除すると、オブジェクトをデータ構造から切り離し、オブジェクト自体の代わりにオブジェクトへの参照 (ポインター) を返します。データ構造が空の場合は、NULL を返します。
pop
キューが空でない場合にのみ有効と定義します。したがって、ユーザーは呼び出す前に空チェックを実行する必要がありますpop
(機能を提供する必要がありisEmpty
ます)。この前提条件が満たされない場合、例外/エラーの戻りは有効な処理です。
一般的に言えば、pop
操作は値を返すべきではありません。これは、返された型のコピー コンストラクターが例外をスローする可能性があるためです。その場合、値はキューから削除され、どこにもコピーされていないため、単純に消えてしまいます。
top
代わりに、データ構造の最上位にあるオブジェクトへの参照を返す関数とpop
、最上位の要素を削除するが何も返さない関数の 2 つの操作が必要です。見るとstd::queue
、メンバーが表示され、最上位の要素への参照が返されます。void pop()
reference front()
今あなたの質問に行きます。<g>
空のキューをポップするとエラーになります。標準ライブラリでは、未定義の動作が発生します。エラー チェック用のコードを追加する場合は、例外をスローするか、プログラムを中止する必要があります。私は後者の方に傾きます。ポップする要素があることを呼び出し元のコードが判断していない場合は、例外を確実に処理するように記述されていない可能性があります。一方、GUI では、現在の操作を終了する例外をスローすることが適切な場合があります。これにより、アプリケーションは実行されたままになり、次のユーザー要求を待ちます。