Обычно вы должны возвращать по значению, то есть sorted_list<Object>
.Более новые версии cpp гарантируют вам, что они на самом деле не будут делать копию.
То, что вы делаете сейчас, неправильно, потому что у него неопределенное поведение.Вы используете un
, который находится в стеке функций, и возвращаете указатель на него.К тому времени, когда функция возвращает un
, она уже вышла из области видимости, и ячейка памяти может быть использована повторно.Просто полностью удалите указатель newlist
и верните взамен un
.
Вы также, похоже, запутались в классах, методах и функциях.Как таковой, ваш метод не обязательно должен быть внутри класса, или, поскольку он, кажется, не использует состояние класса, он может быть статическим, если находится внутри класса.Также не похоже, что это должен быть друг.Если бы вы хотели написать это как функцию-член, она бы выглядела так:
sorted_list<Object>& unionWith(const sorted_list<Object>& rhs) {
// merge this and rhs w deduplication into temp, then swap temp with this
...
return *this;
}
Я думаю, что, скорее всего, ваша проблема в том, что вы не присваиваете &un
newlist
, но вы инициализируете newlist
с &un
.Инициализация выполняется только один раз для функционально-статической переменной, поэтому будущие итерации вашего метода просто пропускают эту строку, и указатель указывает на исходную версию un
.Попробуйте поставить назначение в другую строку.Это должно исправить вашу непосредственную проблему, но решение со статическим указателем все еще очень плохо, потому что указатель используется всеми экземплярами.