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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 13:21   #1
julia9311
Пользователь
 
Регистрация: 23.06.2012
Сообщений: 69
По умолчанию Как перегрузить оператор ввода?

Как перегрузить оператор ввода?

rational.h

Код:
#define _Rational_h_
#include <iostream>
 
using namespace std;
int nod(int p, int q) {
  if (p < 0) p = -p;
  if (q < 0) q = -q;  
  while (p != 0 && q != 0)
    if (p >= q)
      p %= q;
    else
      q %= p;
  return p + q;
}
 
class Rational {
 public:
  Rational() : numerator_(0), denominator_(1) {}
  Rational(int number) : numerator_(number), denominator_(1) {}
  Rational(int numerator, int denominator)
    : numerator_(numerator), denominator_(denominator) {
    optimize_();
  }
  int getNumerator() const { return numerator_; }
  int getDenominator() const { return denominator_; }
 private:
  void optimize_() {
    int nod_ = nod(numerator_, denominator_);
    numerator_ /= nod_;
    denominator_ /= nod_;
    if (denominator_ < 0) {
      numerator_ = -numerator_;
      denominator_ = -denominator_;
    }
  }
  int numerator_;
  int denominator_;
};
 
std::ostream &operator<<(std::ostream &stream, const Rational &number) {
  return stream << number.getNumerator() << "/" << number.getDenominator();
}
 
Rational operator+(const Rational &p, const Rational &q) {
  return Rational(p.getNumerator() * q.getDenominator() +
    q.getNumerator() * p.getDenominator(),
    p.getDenominator() * q.getDenominator());
    
}
 
Rational operator-(const Rational &p, const Rational &q) {
  return Rational(p.getNumerator() * q.getDenominator() -
    q.getNumerator() * p.getDenominator(),
    p.getDenominator() * q.getDenominator());
}
 
Rational operator*(const Rational &p, const Rational &q) {
  return Rational(p.getNumerator() * q.getNumerator(),
    p.getDenominator() * q.getDenominator());
}
 
Rational operator/(const Rational &p, const Rational &q) {
  return Rational(p.getNumerator() * q.getDenominator(),
    p.getDenominator() * q.getNumerator());
}
main

Код:
#include "rational.h"
#include <iostream>
 
using namespace std;
int main() 
{
setlocale(LC_ALL,"russian");
Rational p, q;
Rational x1(5);
Rational x2(2.3);
Rational x3(3);
Rational x4(1);
Rational x5(1.5);
cin >> p;
cin >> q;
  std::cout <<"-p = " << "-" << p << std::endl;
  std::cout <<"1/p = " << x4/p << std::endl;
  std::cout << "p + q = " << (p + q) << std::endl;
  std::cout << "p - q = " << (p - q) << std::endl;
  std::cout << "p * q = " << (p * q) << std::endl;
  std::cout << "p / q = " << (p / q) << std:: endl;
  std::cout << "(x1*p)+(x2*q) = " << (x1*p)+(x2*q) << std:: endl;  
  std::cout << "(x3+(p*q))/(p+(x4-q)) = " << (x3+(p*q))/(p+(x4-q)) << std:: endl;  
  std::cout << "x4/(p+(x5*q)) = " << x4/(p+(x5*q)) << std:: endl;  
system("pause");
}
julia9311 вне форума Ответить с цитированием
Старый 16.01.2013, 13:48   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

julia9311

Как перегрузить оператор ввода?

Точно также, как и оператор вывода o_O (Ваш Кэп)
только стрелочки в другую сторону и ссылка не-константная

std:stream& operator>> (std:stream& os, Rationale& r)
{ вводишь данные
return os;
}
Rififi вне форума Ответить с цитированием
Старый 16.01.2013, 13:54   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Только он называется "оператор поразрядного сдвига вправо", всё-таки.
Abstraction вне форума Ответить с цитированием
Старый 16.01.2013, 14:01   #4
julia9311
Пользователь
 
Регистрация: 23.06.2012
Сообщений: 69
По умолчанию

немного непонятно... Так?

Код:
std::ostream &operator>> (std::ostream& os, Rationale& r){
 return stream >> number.getNumerator() >> "/" >> number.getDenominator();
 return os;
}
julia9311 вне форума Ответить с цитированием
Старый 16.01.2013, 18:50   #5
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

istream вместо ostream
два return либо вызовут ошибку компилятора либо второй никогда не выполнится)
return os удали

и вообще такое не прокатит т.к. нет прав на запись полей.
1) сделать дружественной функцией
в классе прописать friend istream &operator>>(istream& is, Rationale& r);
2) собственно сама функция
Код:
istream &operator>> (istream& is, Rationale& r){
  return is >> r.numerator_ >> r.denominator_;    //очень похоже на cin >> r.numerator_ >> r.denominator_; не так ли?
}
std:: вообщето писать не обязательно

Последний раз редактировалось denrubun; 16.01.2013 в 19:03.
denrubun вне форума Ответить с цитированием
Старый 17.01.2013, 19:33   #6
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

В дополнение ко всему сказанному предоставлю вырезку из своего справочника
Код:
/*
	istream& operator>>(istream& поток, имя_класса &объект)
	ostream& operator<<(ostream& поток, const имя_класса &объект)
*/

#include "iomanip"

class A
{
	int a;
	char *s;
public:
	A(int a, char *s): a(a)
	{	
		this->s = new char[strlen(s)+1];
		strcpy(this->s, s);
	}
	~A() 
	{	delete [] s;	}
	friend ostream& operator<<(ostream&, const A&);
	friend istream& operator>>(istream&, A&);
};

ostream& operator<<(ostream& out, const A& aa)
{	
	out << aa.a << " " << aa.s << endl;
	return out;
}

istream& operator>>(istream& in, A& aa)
{
	in >> aa.a >> aa.s;
	return in;
}

int _tmain(int argc, _TCHAR* argv[])
{
	A a(1,"Yes!"), b(0," ");
	cout << a;					// Результат: 1 Yes!
	cin >> b;
	return 0;
}

Последний раз редактировалось Blind Guard; 17.01.2013 в 19:36.
Blind Guard вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно перегрузить логические операции? julia9311 Общие вопросы C/C++ 8 15.01.2013 13:44
Перегрузить оператор % nuke1 Общие вопросы C/C++ 10 11.12.2011 11:45
Не получается перегрузить оператор / Сотников Роман Помощь студентам 3 28.02.2011 03:14
class date c++...оператор ввода и конвертация... Дмитрий142 Помощь студентам 0 25.04.2010 01:48