2013-07-01 2 views
-1

У меня есть следующий пример, чтобы проиллюстрировать мой вопрос.
У меня есть класс MatrixВозврат ссылок на динамически выделенные объекты

class Matrix{ 


    private: 

     int *array; 
     int x; 
     int y; 

    public: 

     //some other things.. 
     Matrix& operator+(Matrix& add); 
     Matrix& operator=(Matrix& matr); 

} 

Я хочу оператор +, чтобы вернуть совершенно новый объект, который будет назначен Matrix объектов, а не ссылки на MATRIX, ни указателей на Матрицу. Таким образом, оператор = должен просто скопировать значения по частям.

(я знаю, что эта реализация класса Matrix не хорошо, но я делаю это так, чтобы проиллюстрировать мою проблему)

Теперь проблема заключается в реализации оператора +

Сначала я попытался создать объект в перегруженной функции, как этот

Matrix sum; 
//do what i have to do and then 
return sum; 

, но это создает проблемы в виде суммы объекта, конечно, будет разрушен и деструктор матрица конечно

delete [] array;  

Альтернатива заключается в создании

Matrix *sum; 

sum = new Matrix; 

sum->array = new int[//size that i need]; 
//do what i have to do 

return *sum; 

Так что теперь в основном

C=A+B; 

(А, В, С являются матричные объекты)

A + B возвращает вновь созданный ссылка на объект в куче. Этот объект будет присвоен C и будет выполняться копия по биту. C будет иметь правильное значение x, правильное значение y и массив C-> укажет на массив int, который был выделен в перегруженном операторе +

Наконец после этого распайки я буду иметь утечку памяти это будет (SizeOf (Matrix)) байт, которые были выделены у оператора + функции на линии

sum = new Matrix; 

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

Повторяю, что реализация не очень хорошая, но я сделал это просто, чтобы показать проблему, которая у меня есть. Также у меня могли быть только указатели на матрицу в главном и сделать все функции Matrix возвратными указателями матрицы. Это позволило бы решить многие проблемы, но я хочу решение для этого конкретного случая.

+2

'' оператор + должен возвращать новый объект, а не ссылка. – juanchopanza

ответ

1

Оператор + должен возвращать матрицу, а не матрицу &. Просто забудьте последнее.

Подробнее см. В статье 21 «Эффективный C++» Скотта Мейерса.

A fraction here

3

Надлежащий прототипом operator+ является

Matrix operator+(Matrix add); 

и, если таковые имеются, реализуется с помощью operator+=:

{ 
    add += *this; //or just the logic if += isn't implemented 
    return add; 
} 

Обратите внимание, что add передается по значению, потому что вы модифицируя его в любом случае (в отличие от создания нового Matrix) - это оставляет место для оптимизации.

Альтернативой свободная функция будет:

Matrix operator+ (Matrix mat1, const Matrix& mat2) 
{ 
    mat1 += mat2; 
    return mat1; 
} 
+0

Обратите внимание, что существует разница между вашей бесплатной функцией и вашей функцией-членом. В этом случае добавление, вероятно, может считаться коммутативным, но в общем случае это не нужно делать, так что вам может потребоваться фактически «добавить» по ссылке и скопировать '* this', чтобы получить право операнда) , – bitmask

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