Форум программистов, компьютерный форум CyberForum.ru

Исключительные ситуации в классах - C++

Восстановить пароль Регистрация
 
DEMON51
0 / 0 / 0
Регистрация: 13.06.2012
Сообщений: 5
13.06.2012, 16:11     Исключительные ситуации в классах #1
Добрый день.
Нужна помощь, есть класс дробей. В нём я сделал исключительные ситуации для переполенения и для деления на 0. Но надо чтобы try-catch были в функции main, а в классе только throw. Как это сделать?
Код
//class.h-------------------------------------------------------------

#ifndef _DROB_H
#define _DROB_H
#include <math.h>
#include <iostream.h>

class DrobException{             //Класс для исключительных ситуаций
public:
  char mes[256];
  DrobException(char* m) {strcpy(mes, m);}
};


template <class Type>
class drob //класс дробей
{   Type chesl, znam; //числитель и знаменатель
	public:

	drob (Type, Type);


	drob (drob &c)
	{
		chesl = c.chesl;
		znam = c.znam;
	}

	void sokrachenie();     //сокращение дроби

	drob operator*(drob <Type>);  //переопределение *

	drob operator/(drob <Type>);  //переопределение /

	drob operator+(drob <Type>);  //переопределение +

	drob operator-(drob <Type>);  //переопределение -

	~drob () {}

	friend ostream &operator<<(ostream &out, const drob &k) // переопределение оператора <<
	{ if (k.znam==1)
		  out << k.chesl;
	   else
	out << k.chesl << '/' << k.znam;
	return out;
  }



};
template <class Type>
drob <Type>::drob (Type ch=1, Type zn=1)
	{ chesl = ch;
	  znam = zn;
	   try                                               // деление на 0
   { if (znam==0) {
	 throw DrobException("\nError: Devision by zero");
	}
   }
   catch (DrobException e)
   {
	 cout<<e.mes<<endl;
	 //getchar();
	 //exit (1);
   }

   try {                                                   //  переполнение
		 if ((chesl>(sizeof(Type)*8))||(znam>(sizeof(Type)*8))||(chesl<-(sizeof(Type)*8))||(znam<-(sizeof(Type)*8))){
		 throw DrobException ("\nError: Overflow"); }
   } catch (DrobException e) {
   cout<<e.mes<<endl;
	// getchar();
	 //exit (1);
   }

	}

template <class Type>
void drob <Type>::sokrachenie()
 { int a=abs(chesl);
   int b=znam;
  while(b)
	 b^=a^=b^=a%=b;
  int n=abs(a);
  chesl/=n;
  znam/=n;
 }


 template <class Type>
 drob <Type> drob <Type>::operator*(drob <Type> a)
 {drob e;
  //double x=1.*chesl * a.chesl;
  e.chesl = chesl * a.chesl;
  e.znam = znam * a.znam;
  e.sokrachenie();
  return e;
 }

 template <class Type>
 drob <Type> drob <Type>::operator/(drob <Type> a)
 { drob c;
  c.chesl = chesl * a.znam;
  c.znam = znam * a.chesl;
  c.sokrachenie();
  return c;
 }

 template <class Type>
 drob <Type> drob <Type>::operator+(drob <Type> a)
 { drob t;
   t.chesl = a.chesl * znam + chesl * a.znam;
   t.znam = a.znam * znam;
   t.sokrachenie();
	return t;
 }

 template <class Type>
 drob <Type> drob<Type>::operator-(drob <Type> a)
 { drob f;
 f.chesl = chesl * a.znam - znam * a.chesl;
 f.znam = a.znam * znam;
 f.sokrachenie();
 return f;
 }

 #endif


//main.cpp -----------------------------------------------------------

#include "class.h"
int main()
{   drob <short> a(2,4);
  cout << a <<endl;
  a.sokrachenie();
  cout << "Reduction: "<< a << endl;
  drob <short> b(1,3);
  b.sokrachenie();
  cout <<"\n"<< b << endl;
  drob <int> q(3,3);
  cout << "\n"<< q << endl;
  q.sokrachenie();
  cout << "Reduction: "<< q << endl;
  drob <short> c, d, e, f;
  c=a+b;
  d=a*b;
  e=a/b;
  f=a-b;
  drob <int> t(2,0);
  //cout << t << endl;
  drob <int> h(2,10000000000000);
  //cout << h << endl;
  drob <int> u(32655896, 2);
  //cout << u << endl;
  cout << "\nArithmetic operations:" << endl;
  cout << a<< " / " << b << " = " << e << endl;
  cout << a<< " + "<< b<< " = " << c << endl;
  cout << a<< " * " << b<< " = " << d << endl;
  cout << a<< " - " << b<< " = " << f << endl;
  getchar();
	return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 16:11     Исключительные ситуации в классах
Посмотрите здесь:

Исключительные ситуации C++
исключительные ситуации C++
Исключительные ситуации C++
C++ исключительные ситуации
Исключительные ситуации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.06.2012, 16:34     Исключительные ситуации в классах #2
Цитата Сообщение от DEMON51 Посмотреть сообщение
Но надо чтобы try-catch были в функции main, а в классе только throw. Как это сделать?
Убрать try-catch из методов класса и добавить их в main.
Ваш Капитан.
DEMON51
0 / 0 / 0
Регистрация: 13.06.2012
Сообщений: 5
13.06.2012, 16:36  [ТС]     Исключительные ситуации в классах #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Убрать try-catch из методов класса и добавить их в main.
Ваш Капитан.
Это все конечно круто, но так я и сам пробовал, не работает)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.06.2012, 16:42     Исключительные ситуации в классах #4
Цитата Сообщение от DEMON51 Посмотреть сообщение
так я и сам пробовал, не работает)
Пиши код, который не работает и уже по нему будем решать.
DEMON51
0 / 0 / 0
Регистрация: 13.06.2012
Сообщений: 5
13.06.2012, 16:45  [ТС]     Исключительные ситуации в классах #5
Вот я делаю так: в main добавляю try
Код
int main()
{ drob <short> a(2,4);
  cout << a <<endl;
  a.sokrachenie();
  cout << "Reduction: "<< a << endl;
  drob <short> b(1,3);
  b.sokrachenie();
  cout <<"\n"<< b << endl;
  drob <int> q(3,3);
  cout << "\n"<< q << endl;
  q.sokrachenie();
  cout << "Reduction: "<< q << endl;
  drob <short> c, d, e, f;
  c=a+b;
  d=a*b;
  e=a/b;
  f=a-b;
  drob <int> t(2,0);
  //cout << t << endl;
  drob <int> h(2,10000000000000);
  //cout << h << endl;
  drob <int> u(32655896, 2);
  //cout << u << endl;
  cout << "\nArithmetic operations:" << endl;
  cout << a<< " / " << b << " = " << e << endl;
  cout << a<< " + "<< b<< " = " << c << endl;
  cout << a<< " * " << b<< " = " << d << endl;
  cout << a<< " - " << b<< " = " << f << endl;
  getchar();
  try {

	 } catch (DrobException e) { cout<<e.mes<<endl; getchar();
  }
	return 0;
}
а из класса убираю, оставляю только throw. А что в try писать не знаю.
Код
#ifndef _DROB_H
#define _DROB_H
#include <math.h>
#include <iostream.h>

class DrobException{             //Класс для исключительных ситуаций
public:
  char mes[256];
  DrobException(char* m) {strcpy(mes, m);}
};


template <class Type>
class drob //класс дробей
{   Type chesl, znam; //числитель и знаменатель
	public:

	drob (Type, Type);


	drob (drob &c)
	{
		chesl = c.chesl;
		znam = c.znam;
	}

	void sokrachenie();     //сокращение дроби

	drob operator*(drob <Type>);  //переопределение *

	drob operator/(drob <Type>);  //переопределение /

	drob operator+(drob <Type>);  //переопределение +

	drob operator-(drob <Type>);  //переопределение -

	~drob () {}

	friend ostream &operator<<(ostream &out, const drob &k) // переопределение оператора <<
	{ if (k.znam==1)
		  out << k.chesl;
	   else
	out << k.chesl << '/' << k.znam;
	return out;
  }



};
template <class Type>
drob <Type>::drob (Type ch=1, Type zn=1)
	{ chesl = ch;
	  znam = zn;

	  if (zn==0) {
	  throw DrobException("\nError: Devision by zero");	  }

	}

template <class Type>
void drob <Type>::sokrachenie()
 { int a=abs(chesl);
   int b=znam;
  while(b)
	 b^=a^=b^=a%=b;
  int n=abs(a);
  chesl/=n;
  znam/=n;
 }


 template <class Type>
 drob <Type> drob <Type>::operator*(drob <Type> a)
 {drob e;
  //double x=1.*chesl * a.chesl;
  e.chesl = chesl * a.chesl;
  e.znam = znam * a.znam;
  e.sokrachenie();
 /* if ((e.chesl>(sizeof(Type)*8))||(e.znam>(sizeof(Type)*8)))
  throw DrobException ("\nError: Overflow");  */

  return e;
 }

 template <class Type>
 drob <Type> drob <Type>::operator/(drob <Type> a)
 { drob c;
  c.chesl = chesl * a.znam;
  c.znam = znam * a.chesl;
  c.sokrachenie();
  return c;
 }

 template <class Type>
 drob <Type> drob <Type>::operator+(drob <Type> a)
 { drob t;
   t.chesl = a.chesl * znam + chesl * a.znam;
   t.znam = a.znam * znam;
   t.sokrachenie();
  /* if ((t.chesl>(sizeof(Type)*8))||(t.znam>(sizeof(Type)*8)))
  throw DrobException ("\nError: Overflow"); */

	return t;
 }

 template <class Type>
 drob <Type> drob<Type>::operator-(drob <Type> a)
 { drob f;
 f.chesl = chesl * a.znam - znam * a.chesl;
 f.znam = a.znam * znam;
 f.sokrachenie();
 return f;
 }

 #endif
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.06.2012, 16:54     Исключительные ситуации в классах #6
try-catch дожен обрамлять код, генерирующий исключение. Поэтому try из строки 31 перенеси в строку 3.
DEMON51
0 / 0 / 0
Регистрация: 13.06.2012
Сообщений: 5
13.06.2012, 20:45  [ТС]     Исключительные ситуации в классах #7
Deviaphan, спасибо большое, стало понятнее, заработало

Добавлено через 3 часа 7 минут
А еще подскажите, почему арифметические операторы работают только с типом short?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2012, 20:49     Исключительные ситуации в классах #8
Цитата Сообщение от DEMON51 Посмотреть сообщение
А еще подскажите, почему арифметические операторы работают только с типом short?
что за бред?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.06.2012, 20:52     Исключительные ситуации в классах #9
похоже автор пытался складывать дроби разных типов и компилятор ругался на такой код. есди дело было так, то понятно. текущая версия кода не умеет складывать дроби двух разных типов:
C++
1
2
3
drob<int> intDrob;
drob<short> shortDrob;
shortDrob + intDrob; // ошибка
DEMON51
0 / 0 / 0
Регистрация: 13.06.2012
Сообщений: 5
13.06.2012, 20:55  [ТС]     Исключительные ситуации в классах #10
Jupiter, если в main писать drob <int> (1,3), то при запуске он выдает ошибку [C++ Error] Unit1.cpp(16): E2094 'operator+' not implemented in type 'drob<int>' for arguments of type 'drob<short>' и так для всех операторов. Т.е. перегруженные +, -, *, / не работают

Добавлено через 1 минуту
DU, А, да, прощения прошу, я тупой)) Спасибо)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2012, 20:56     Исключительные ситуации в классах
Еще ссылки по теме:

C++ Исключительные ситуации
C++ Исключительные ситуации
C++ Исключительные ситуации!

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.06.2012, 20:56     Исключительные ситуации в классах #11
Цитата Сообщение от DEMON51 Посмотреть сообщение
Т.е. перегруженные +, -, *, / не работают
Чуть выше тебе именно об этом написали, drob<short> и drob<int> это разные типы. Тебе нужно либо конструкторы преобразования писать (не рекомендую), либо одного типа данные использовать.
Yandex
Объявления
13.06.2012, 20:56     Исключительные ситуации в классах
Ответ Создать тему
Опции темы

Текущее время: 12:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru