Ver Mensaje Individual
  #5 (permalink)  
Antiguo 16/01/2016, 09:10
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Guardar y leer objeto en archivo

Si has usado cin y cout te habrás fijado en que:
  • Para enviar algo a cout se usa el operador <<
  • Para recibir algo de cin se usa el operador >>

Si has declarado << con ofstream y >> con ifstream... tienes que usar el operador << para almacenar datos en el stream y >> para recuperarlos... no usar << todo el rato.

Podrías usar << todo el rato si modificas la función

Código C++:
Ver original
  1. istream& referidosRegistro::operator>>(istream& stream)

y la dejas tal que:

Código C++:
Ver original
  1. istream& referidosRegistro::operator<<(istream& stream)

Ahora bien, esto te puede ocasionar dos problemas:
  1. Se dificulta la lectura del programa, ya que la gente espera que << funcione para guardar y >> para leer.
  2. Si usas un stream de lectura y escritura y llamas al operador <<... ¿Qué función se llama, la que lee del stream o la que escribe en el mismo? Tu no lo sabes, yo tampoco y el compilador tampoco, por lo que te dará un error de compilación.

Por cierto, estos operadores suelen devolver el objeto que han recibido como argumento para poder concatenar operadores:

Código C++:
Ver original
  1. std::cout << "A" << 5 << 'c';

Es equivalente a:

Código C++:
Ver original
  1. std::cout << "A";
  2. std::cout << 5;
  3. std::cout << 'c';

Para entender por qué funciona al concatenarlos tienes que ver los operadores como funciones de toda la vida pero con una sintaxis ligeramente diferente. Puesto a modo de función, que se puede, quedaría así:

Código C++:
Ver original
  1. std::cout.operator<<("A").operator<<(5).operator<<('c');

Y esto funciona porque....

std::cout.operator<<("A") imprime la cadena en la pantalla y retorna std::cout, luego lo siguiente que se ejecuta es...
std::cout.operator<<(5) que imprime el 5 en pantalla y se vuelve a retornar std::cout, con lo que la última parte de la línea acaba ejecutando...
std::cout.operator<<('c') que finalmente imprime el carácter por pantalla.

El compilador es tan listo (bueno, no es que sea listo, es que dice el estándar cómo tienen que funcionar estas cosas) que sabe cacharrear el código para convertir una sintaxis bonita, sencilla y legible en una amalgama de funciones... y todo sin que tú tengas que preocuparte de ello.

Espero que con estas aclaraciones te haya quedado el tema un poco más sencillo de digerir.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.