Программирование на "С/C++" и не только

Previous Entry Share Next Entry
функция возвращает объект с динамической ссылкой
kaz_orphan wrote in ru_cpp
уперся в следующее:

есть класс содержащий в себе указатель на динамическую память (кучу). В общем-то это массив размерность которого определяется при создании объекта. конструктор объекта кроме всего прочего, выделяет сколько нужно памяти и вносит ее адрес в соответствующее поле.

class MyClass {
...
type* data;
...
}

соответственно деструктор освобождает эту память, во избежание утечек памяти.

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

внутри метода - все просто: создаю локальный экземпляр объекта, изменяю его динамическую область. А вот как вернуть это в вызывающий контекст - убей бох не пойму. Если сделать просто

MyClass MyClass::method(....) {

MyClass temp(....);
...
return temp;
}

деструктор объекта похерит динамическую память и присвоение

MyClass X(...);
MyClass Y(...);
...
Y = X.method(...);

заканчивается ошибкой кучи при выполнении.

Третий час сижу и ломаю голову, ничего не придумал. Что делать?

  • 1
кроме того есть метод класса, который должен вернуть значение - объект того же класса, но с измененными значениями динамической памяти. Исходный объект и память на которую он указывает должны остаться неизменными.

"Смысл" такого возвращаемого значения - это должно быть "самостоятельное" значение или что?
Можно сделать статическую переменную внутри метода (но тогда будет только один возвращаемый объект), можно создать скрытое поле-указатель на объект класса, указатель и возвращать через метод (тогда для этого поля нужно создавать объект класса через new и делать delete в деструкторе).
Можно ввести операцию присваивания, которая будет обменивать объекты, на которые укахывает data у каждого из объектов и создать конструктор копирования, который присваивает полю data создаваемого объекта значение поля data объекта, с которого копируется, а тому - записывает NULL в поле data.
Тогда мы возвращаем сам тип MyClass.
Будет некоторое количество лишних присваиваний - но работать будет.

  • 1
?

Log in