Перегрузка операций (дубль два с исходниками)
От: Гарин Георгий  
Дата: 25.01.02 07:52
Оценка:
Здравствуйте.
Снова обращаюсь с той же проблемой: перегрузкой операций. (Листинг прилагается)
Суть проблемы:
Есть класс — класс комплексных чисел (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.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_COMPLEX_H__5100A56F_1124_11D6_90B7_B70084C92051__INCLUDED_)
#define AFX_COMPLEX_H__5100A56F_1124_11D6_90B7_B70084C92051__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class complex
{
public:
double re,im;
complex();
virtual ~complex();

};

#endif // !defined(AFX_COMPLEX_H__5100A56F_1124_11D6_90B7_B70084C92051__INCLUDED_)




// complex.cpp: implementation of the complex class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ex.h"
#include "complex.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

complex::complex()
{

}

complex::~complex()
{

}


// polynom1.h: interface for the polynom class.
//
//////////////////////////////////////////////////////////////////////
#include "complex.h"
#if !defined(AFX_POLYNOM1_H__5100A571_1124_11D6_90B7_B70084C92051__INCLUDED_)
#define AFX_POLYNOM1_H__5100A571_1124_11D6_90B7_B70084C92051__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000



class polynom : public complex
{
public:

complex* p;

polynom(int);
virtual ~polynom();
polynom polynom::operator=(polynom&);
polynom polynom::operator+(polynom);
int deg;
};

#endif // !defined(AFX_POLYNOM1_H__5100A571_1124_11D6_90B7_B70084C92051__INCLUDED_)



// polynom1.cpp: implementation of the polynom class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ex.h"
#include "polynom1.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

polynom::polynom(int degree)
{
try {
deg=degree;
p=new complex[degree+1];
if (!p) throw "constructor error";
}
catch (char*msg){
::MessageBox(NULL,msg,NULL,MB_OK);
}

}
polynom::~polynom(){
try {
delete [] p;
}
catch(...) {
::MessageBox(NULL,"destructor error",NULL,MB_OK);







}
}
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
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.