一見すると、ポインタ関連の問題は見当たりません。代わりに参照を使用しmerge
、メンバー関数を作成することをお勧めしVectorPQueue
ますが、最初の引数を渡す必要はありません (他の人が既に指摘したように)。私を混乱させるもう1つのことは、チェックですone->size() != 0
-one
が空の場合、何が問題になりますか? のサイズのみに依存するため、以下のコードは に正しく挿入two
されます。one
two
の削除についてtwo
:
それは実装者ではなく、クライアントのタスクになります
インターフェースをどのように設計するかは、あなた次第です。しかし、関数はtwo
の要素を に追加するだけなので、one
削除すべきではないと思います。ところで、このメソッドのより良い名前は、addAllFrom()
またはこのようなものだと思います。
一般的なポインタについて:
スマート ポインターを調べてみることを強くお勧めします。これらは、メモリ管理の労力を軽減するための C++ での一般的な手法です。裸のポインターを使用し、新規/削除を介して手動で管理することは、非常にエラーが発生しやすく、強力な例外セーフにするのが難しく、メモリリークなどをほぼ確実に保証します。一方、スマートポインターは、含まれているポインターがなくなるとすぐに自動的に削除しますもう必要です。説明のために、C++ std lib にはauto_ptr
(unique_ptr
およびshared_ptr
コンパイラが C++ 11 をサポートしている場合) があります。次のように使用されます。
{ // Beginning of scope
std::auto_ptr<PQueue> one(PQueue::createPQueue(PQueue::UnsortedVector));
// Do some work with one...:
one->someFunction();
// ...
} // End of scope - one will automatically be deleted
個人的な経験則: スマート ポインターでラップされたポインターのみを使用します。次の場合にのみ、ヒープ割り当てオブジェクトのみを使用します。
- それらは作成されたスコープよりも長く存続する必要があり、コピーはコストがかかりすぎます (幸いなことに、C++ 11 にはムーブ セマンティクスがあり、そのようなケースの多くが排除されます)。
- それらの仮想関数を呼び出す必要があります
それ以外の場合は、スタックに割り当てられたオブジェクトと STL コンテナーをできるだけ使用するようにしています。
C++ を使い始めた場合、これは最初は大変に思えるかもしれません。スマート ポインターなどに取り掛かる前に、ポインターを完全に理解しようとすることはまったく問題ありません (必要な場合もあります)。ただし、後でデバッグするのに多くの時間を節約できます。の上。また、C++ に関する本を何冊か読むことをお勧めします。最初の本を読むまでは、実際には C++ のほとんどを理解していると思っていました :)