0

二分探索木があり、テンプレートを使用して任意のクラス オブジェクトを追加します。

上記のクラスオブジェクトまたは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 を返すことはできますか?これも Matrix ですか?

注: これは宿題のためです。メモリ リークは私の最後の懸念事項です。シンプルさとスピードは私の最初の問題です

4

2 に答える 2

2

NULLいいえ、オブジェクトに割り当てることはできません。

Matrix mat; mat = NULL;

あなたの場合は違法です。を持つことができるようにしたい場合はNULL、代わりにポインターを使用できます(生またはスマート)。

于 2012-06-14T10:09:02.327 に答える
1

関数からオブジェクトを返すには、アクセス可能なコピーまたは移動コンストラクターが必要です。代入演算子は必要ありません。それは割り当てにのみ必要です。もちろん、関数の結果を以前に宣言された変数に割り当てる場合は、それが必要になります。

パブリック コピー コンストラクターとコピー代入演算子は、自分で decare しない場合、自動的に生成されることに注意してください。

ただし、オブジェクトがデストラクタで解放されるリソースを管理している場合は、Rule of Threeを考慮する必要があります。コピー コンストラクターと代入演算子を実装するか削除する必要があります。そうしないと、誤ってメモリ リークが発生しやすくなり、さらに悪いことに、2 つのオブジェクトが両方とも同じリソースを解放しようとする可能性があります。

新しい質問に答えるために、オブジェクトの代わりに null ポインターを返すことはできません。ポインター (ツリーに含まれるものへの生のポインター、または新しく割り当てられたコピーのようなスマート ポインターのいずれか) を返すか、std::unique_ptr<Type>メモリ リークの可能性を低くすることができますboost::optional<Type>

于 2012-06-14T10:08:01.003 に答える