Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2011, 18:17   #1
Ale-X91
 
Регистрация: 28.07.2011
Сообщений: 8
Восклицание Абстрактный класс чисел

Нужно создать абстрактный класс чисел с виртуальными методами - арифметическими операциями. У этого класса 2 наследника - комплексные числа и дроби. Вот мой код:

Код:
#include <iostream>
#include <string>
#include <math.h>
const double EPS = 1e-4;
using namespace std;

void divide(_int64 &a, _int64 &b){
	_int64 i = 2;
	do
		if(a%i == 0 && b%i == 0){
			a /= i;
			b /= i;
		}
		else
			i++;
	while(i <= a && i <= b);
};

class Number{
public:
	virtual ostream& print(ostream& st) const = 0;
	virtual Number& sum(Number& a) = 0;
};

class Fraction: public Number{
private:
	int chisl, znam;
public:
	Fraction(int a = 0, int b = 1);
	double get_value() {return 1.0*chisl/znam;};
	ostream& print(ostream& st) const ;
	Number& sum(Number& a);
};
Fraction::Fraction(int a, int b){
	_int64 a2 = a*abs(b)/b;
	_int64 b2 = abs(b);

	divide(a2, b2);

	chisl = a2;
	znam = b2;
};
ostream& Fraction::print(ostream &st) const {
	return (st << chisl << "/" << znam);
};
Number& Fraction::sum(Number& a){
	Number* temp = new Fraction(); // Временный объект. Возвращается ссылка на него
	Fraction arg = (Fraction&) a; //Аргумент
	
	_int64 com_znam = znam * arg.znam;//Общий знаменатель
	_int64 res_chisl = chisl*arg.znam + arg.chisl*znam;//Числитель результата
	divide(res_chisl, com_znam); //Сокращение дроби

	((Fraction*)temp)->chisl = res_chisl;
	((Fraction*)temp)->znam = com_znam;

	return *temp;
};

class Complex: public Number{
private:
	double Re, Im;
public:
	Complex(double a = 0, double b = 0): Re(a), Im(b) {};
	double get_real() {return Re;};
	double get_im() {return Im;};
	ostream& print(ostream& st) const ;
	Number& sum(Number& a);
};
ostream& Complex::print(ostream &st) const {
	if(abs(Re) >= EPS){
		st << Re;
		double Im_abs = abs(Im);
		if(Im_abs >= EPS){
			if(Im > 0)
				st << "+";
			else
				st << "-";
			if(abs(Im_abs -1) >= EPS)
				st << Im_abs;
			st << "i";
		}
	}
	else
		st << Im << "i";
	return st;
};

Number& Complex::sum(Number& a){
	Number* temp = new Complex();
	((Complex*)temp)->Re = this->Re + ((Complex&) a).Re;
	((Complex*)temp)->Im = this->Im + ((Complex&) a).Im;
	return *temp;
}

inline ostream& operator << (ostream& st, const Number& val){
	return val.print(st);
};

inline Number& operator+(Number& a, Number& b){
	return a.sum(b);
};
int main(){
	Number* ac = new Complex(-10, 2.5);
	Number* bc = new Complex(18, -6.5);

	Number& res_c = ac->sum(*bc);
	cout << res_c << endl;

	Complex val1(12, 13);
	Complex val2(5, 6);
	cout << val1 + val2 << endl;

	cin.get();
	return 0;
}
Но при сложении создается временный объект в динамической памяти. Как его удалять? Или как сделать по-другому, чтоб были виртуальные методы и перегрузка операций.
Ale-X91 вне форума Ответить с цитированием
Старый 28.07.2011, 21:56   #2
Ale-X91
 
Регистрация: 28.07.2011
Сообщений: 8
По умолчанию

Помогите пжл
Ale-X91 вне форума Ответить с цитированием
Старый 29.07.2011, 11:49   #3
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Ale-X91 Посмотреть сообщение
Но при сложении создается временный объект в динамической памяти. Как его удалять? Или как сделать по-другому, чтоб были виртуальные методы и перегрузка операций.
Можно возвращать ссылку на статический объект.
Код:
static Complex c;
 Complex& Complex::operator+( const Complex& a) const {
	Complex &temp = c;
	temp = *this;
	temp.Im += a.Im;
	temp.Re += a.Re;
	return temp;
 }
An1ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ абстрактный класс графического объекта Che3ter Общие вопросы C/C++ 2 16.01.2011 07:27
Указатель на абстрактный класс zhenya.ya Общие вопросы C/C++ 0 11.11.2010 23:51
абстрактный класс С++ zhenya.ya Помощь студентам 0 05.11.2010 20:23
Наследование: абстрактный класс zak Общие вопросы C/C++ 4 22.12.2007 13:49