Здравствуйте.
Снова обращаюсь с той же проблемой: перегрузкой операций. (Листинг прилагается)
Суть проблемы:
Есть класс — класс комплексных чисел (complex). В нем определены два public члена re и im.
Есть второй класс — класс полиномов (многочленов), который явл-ся потомком предыдущего класса. В этом классе есть две public переменные:
complex*p — массив коэффициентов многочлена.
int deg — степень многочлена.
При инициализации конструктор выделяет память под массив коэффициентов (р)
При деинициализации деструктор освобождает память из под (р) (delete [] p)
Пытаюсь определить операцию присваивания и сложения для полиномов. (см. листинг)
(Равенство степеней складываемых многочленов не проверяется, т.к. вопрос пока не в этом.Будем считать, что многочлены одинаковых степеней.)
Операции проходят, но почему то вызывается деструктор, причем четыре раза. Я конечно могу понять, что при выходе из операции + разрушается созданный там объект. Но почему разрушаются еще три объекта? Как это можно обойти? Перегружать операцию +=?
Операция выполняется в методе OnInitDialog() (диалоговое приложение mfc), вот так
polynom p1(2),p2(2),p3(2);
p3=p1+p2; здесь вызываются четыре деструктора.
Вопрос 2: можно ли определить операцию присваивания так, чтобы в левой части был указатель на объект(причем не инициализированный), а в самой операции происходило бы выделение памяти под объект (new) и возврашался бы указатель?
Т.е.
polynom p1(2),p2(2),*p3;
...
p1,p2 как-то заполнюятся значениями
...
p3=p1+p2 <- Как сделать так?
Заранее спасибо.
Обещанный листинг:
// complex.h: interface for the complex class.
//
//////////////////////////////////////////////////////////////////////
}
}
polynom polynom::operator=(polynom&a){
for (int i=0;i<=a.deg;i++) { this->p[i].im=a.p[i].im; this->p[i].re=a.p[i].re;
}
return*this;
}
polynom polynom::operator+(polynom a) {
polynom tmp(a.deg);
for (int i=0;i<=a.deg;i++) {
tmp.p[i].im=this->p[i].im+a.p[i].im;
tmp.p[i].re=this->p[i].re+a.p[i].re;
}
return tmp; // вот здесь tmp должен разрушиться. Что вообщем то и происходит.
}
//
BOOL CExDlg::OnInitDialog()
{
// все лишнее удалено
polynom a(2),b(2),c(2);
// c=a;
c=a+b;
return TRUE; // return TRUE unless you set the focus to a control
}