バイナリ検索ツリーがあり、テンプレートを使用して任意のクラスオブジェクトを追加します。
上記のクラスオブジェクトまたはNULLを返す検索関数があります
このオブジェクトを返すには、「=」をオーバーロードする必要がありますか? 私は、オブジェクトを返すかどうかを確認することを望んでいました:同じタイプがLHSに格納されている値をRHSに格納されている値で置き換え、NULLが最初のオブジェクトをNULLとしてマークする場合。
私の間違いはおそらく他のどこか(私が返すのは完全なオブジェクトまたはNULLのいずれかであり、他には何もありません)または実際にそれをオーバーロードする必要がありますか?
時間は非常に限られているため、必要に応じてこれを行うにはどうすればよいですか?そして、それは速いプロセスですか、それとも多くの変更を伴いますか。
コードの不足で申し訳ありませんが、関連するものは考えられません。
EDIT また、多くのNULLを使用するため、オブジェクトにNULLを返すことができますか?例:
class Matrix {
private:
int col;
int line;
int value;
}
Matrix mat; mat = NULL;
いくつかのコード:
template <typename Type>
Type BST<Type>::search(int key) {
if (this->root == NULL)
return NULL;
else
return root->search(key);
ここで、TypeはMatrixです。 NULLを返すか、検索に進んでTypeを返すことはできますか?
注:これは宿題のためであり、メモリリークは最後の懸念事項です。シンプルさとスピードが私の一番の問題です
回答:
回答№1は2いいえ、割り当てることはできません NULL
オブジェクトに。
Matrix mat; mat = NULL;
あなたの場合は違法です。あなたが持つことができるようにしたい場合 NULL
、代わりにポインターを使用できます(rawまたはsmart)。
回答№2の場合は1
関数からオブジェクトを返すには、次のものが必要です。アクセス可能なコピーまたは移動コンストラクター。代入演算子は必要ありません。それは、割り当てにのみ必要です。もちろん、以前に宣言された変数に関数の結果を割り当てる場合は、それが必要になります。
パブリックコピーコンストラクタとコピー割り当て演算子は、自分で「気にしない」場合に自動的に生成されることに注意してください。
ただし、オブジェクトがデストラクタで解放されたリソースを管理している場合は、「考慮する必要があります」 3つのルール。コピーを実装または削除する必要がありますコンストラクターと代入演算子。そうしないと、誤ってメモリリークが発生する可能性が非常に高く、さらに悪いことに、2つのオブジェクトが同じリソースを解放しようとする可能性が非常に高くなります。
新しい質問に答えるために、「オブジェクトの代わりにnullポインタを返すことはできません。ポインタ(ツリーに含まれる何かへの生のポインタ、または std::unique_ptr<Type>
メモリリークの可能性を減らすために、新しく割り当てられたコピー、または boost::optional<Type>
.