#ifndef FRACCION_H
#define FRACCION_H

#include <iostream>

typedef long long entero;

class Fraccion
{
  private:
	entero numerador;
	entero denominador;

  public:
	/// Constructor por defecto y constructor de conversion
	Fraccion(entero numerador = 0, entero denominador = 1);
	/// Destructor
	~Fraccion();
	// La relacion de amistad permite a los operadores sobrecargados como funciones libres acceder
	// a los miembros privados y protegidos de los objetos Fraccion
	friend std::ostream& operator<<(std::ostream& salida, const Fraccion& fraccion);
	friend std::istream& operator>>(std::istream& entrada, Fraccion& fraccion);
	friend Fraccion operator+(const Fraccion& a, const Fraccion& b);

#if 0
	// Si el operador de copia y el operador de asignacion se declaran privados,
	// C++ no permitira hacer copias de los objetos. En tal caso no es necesario
	// implementar dichos metodos, ya que no seran invocados nunca
  private:
	/// Constructor de copia
	Fraccion(const Fraccion& otra);
	/// Operador de asignacion
	const Fraccion& operator=(const Fraccion& otra);
#endif
};

/// Permite cout << f1 << f2 << ...
std::ostream& operator<<(std::ostream& salida, const Fraccion& fraccion);

/// Permite cin >> f1 >> f2 >> ...
std::istream& operator>>(std::istream& entrada, Fraccion& fraccion);

/// Permite f1 + f2
/// Permite f1 + 13
/// Permite 13 + f2
/// Nunca se invoca con dos tipos primitivos como: 13 + 2
Fraccion operator+(const Fraccion& a, const Fraccion& b);

#endif // FRACCION_H
