![]() |
От куда взялся деструктор?
Решение этой проблемы меня уже порядком достало, поэтому решил спросить у профессионалов, знающих ООП.
Проблема собтвенно в том, что в следующем перезагруженном операторе выполняется 1 коструктор и 2 деконструктора. От куда берется второй деконструктор в этом коде: vector vector::operator + (const vector &obj) { if (this->n != obj.n) cout << "Error: diff. dim\n"; vector tmp(obj.n); for (long i=0; i<obj.n; i++) { tmp.x[i] = this->x[i] + obj.x[i]; } return tmp; } У меня здесь динамическое выделение памяти под объекты, и, естественно, что двухразовое выполнение delete ни к чему хорошему привести не может. Поэтому хочу устраниться данную ошибку. Ниже полный код проги: #define real double #include <conio.h> #include <stdio.h> #include <iostream.h> //-------------- class vector { public: real *x; long n; public: vector(); vector(long); ~vector(); vector& operator = (const vector&); vector operator + (const vector&); }; vector::vector () { n = 1; x = new real[n]; cout << "constructor \n"; } vector::vector (long dim) { n = dim; if (n>0) x = new real[n]; cout << "constructor \n"; } vector::~vector() { delete[] x; n = 0; cout << "destructor \n"; } vector& vector::operator = (const vector &obj) { if (this->n != obj.n) cout << "Error: diff. dim\n"; for (long i=0; i<obj.n; i++) { this->x[i] = obj.x[i]; cout << obj.x[i] << " , " << this->x[i] << "\n"; } return (*this); } vector vector::operator + (const vector &obj) { if (this->n != obj.n) cout << "Error: diff. dim\n"; vector tmp(obj.n); for (long i=0; i<obj.n; i++) { tmp.x[i] = this->x[i] + obj.x[i]; } return tmp; } //----------- void main() { { vector a(3); vector b(3); a + b; } getch(); } //================ результат её выполнения: constructor constructor constructor destructor destructor // !!!!!! destructor destructor |
zl3p
Предлагаю вам ознакомиться с таким понятием, как "конструктор копирования по умолчанию". Код:
vector vector::operator + (const vector &obj) В общем решение простое - объявите конструктор копирования, например так Код:
vector::vector (const vector &v) |
Да! Большое спасибо. Наконец-то я понял для чего нужны эти конструкторы копирования. =)
|
Правда, всё оказалось не так просто....
С ростом размера проги, начали возникать разные глюки. Теперь уже даже не знаю, где искать ошибки. В частности, ещё не до конца понял как работает простая строка Цитата:
Кстати, чего лучше такого почитать по ООП, где всё это, и не только, было бы доступно объяснено? |
Цитата:
Цитата:
|
Время: 03:23. |
Время: 03:23.
© OSzone.net 2001-