2012-06-14 3 views
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); 

Здесь тип является матрица. Могу ли я вернуть NULL или пойти дальше с поиском и возвратом Type, который снова является Matrix?

Примечание: Это для домашних целей, утечка памяти - моя последняя забота. Простота и скорость - это, безусловно, моя первая проблема.

+3

Я думаю, что код был бы уместным, это не совсем понятно, что вы хотите. Зачем вам нужно перегружать '=' to ** return ** объект? Вы используете '=' для назначения объекту (хотя он имеет возврат). –

+1

с объемом информации, которую вы предоставляете по предмету, сложно сказать, что вам нужно. в общем случае компилятор C++ генерирует глубокие (вызывающие операторы присваивания операторам) код оператора присваивания автоматически. – bobah

+1

Функции поиска контейнеров STL возвращают итератор; если итератор имеет определенное магическое значение (обычно равное 'container.end()'), поиск считается неудачным. Другая возможность - переопределить приведение к 'bool' на вашем объекте, поэтому специальный экземпляр класса, представляющий пустой или несуществующий узел, будет оцениваться как' false'. – Rook

ответ

2

Нет, вы не можете назначить NULL объекту.

Matrix mat; mat = NULL; 

В вашем случае незаконно в вашем случае. Если вы хотите иметь NULL, вместо этого вы можете использовать указатели (raw или smart).

+0

так что я могу сделать 'Matrix * mat = new Matrix', тогда' mat = NULL'? – Kalec

+2

@Kalec да, но тогда вы просачиваете память. Вы должны вручную «удалить мат», когда вам это больше не нужно. –

+0

Это домашнее задание, поэтому мне все равно, спасибо. – Kalec

1

Чтобы вернуть объект из функции, он должен иметь доступный экземпляр или перемещать конструктор. Ему не нужен оператор присваивания; это необходимо только для назначения. Конечно, вам понадобится это, если вы назначаете результат функции ранее объявленной переменной.

Обратите внимание, что создатель публичных копий и оператор присваивания копий будут сгенерированы автоматически, если вы не будете их обрабатывать самостоятельно.

Однако, если ваш объект управляет ресурсами, которые освобождены в своем деструкторе, тогда вам нужно будет рассмотреть Rule of Three. Вы должны либо реализовать, либо удалить конструктор копирования и оператор присваивания; в противном случае, очень легко случайно ввести утечки памяти, и, что еще хуже, иметь два объекта, пытающихся освободить одни и те же ресурсы.

Чтобы ответить на новый вопрос, вы не можете вернуть нулевой указатель вместо объекта. Вы можете либо вернуть указатель (либо необработанный указатель на что-то, содержащееся в дереве, либо умный указатель, например std::unique_ptr<Type>, на новую выделенную копию, чтобы уменьшить вероятность утечки памяти), или нулевым типом объекта, например boost::optional<Type>.

Смежные вопросы