Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: progTata en 1 Abril 2011, 16:30 pm



Título: Error con sobrecarga de Ostream
Publicado por: progTata en 1 Abril 2011, 16:30 pm
Hola Gente! Pues, soy nuevo en el foro y estoy haciendo una carrera de programador en la que nos enseñan C++. Tenemos que crear una clase llamada "Fecha" que tiene los valores privados dia, mes, año. hay que sobrecargar el operador "<<" para que muestres correctamente la fecha, algo asi "dd/mm/aaaa". aqui esta el codigo

Código:
//Fecha.h

class Fecha
          {     
           private:
                   int dia;
                   int mes;
                   int año;
           public:
                  Fecha();                      //Constructor por defecto
                  Fecha(int d, int m, int a);
                  void setDia(int d);
                  void setMes(int m);
                  void setAnio(int a);
                  int getDia();
                  int getMes();
                  int getAnio();
                  ostream &operator << (ostream o, Fecha f);
                  };

ahora el .cpp

Código:
// main.cpp

#include "Fecha2.h"
#include <iostream.h>
#include <stdio.h>
#include <conio.h>

ostream &operator << (ostream &o, Fecha &f)
{   int a, m, d;
    a = f.getDia();
    m = f.getMes();
    d = f.getDia();
    o << d << "." << m << "." << a;
    return o;
}
       
int main()
{Fecha fecha1;
 int a, m, d, o;
 cout<<"Ingresar Fecha: ";
 cin>>d;
 cin>>m;
 cin>>a;
 fecha1.setDia(d);
 fecha1.setMes(m);
 fecha1.setAnio(a);
 cout<<"1. Mostrar mediante funcion\n";
 cout<<"2. Mostrar comun\n";
 cin>>o;
 if( o == 1)
     {cout<<fecha1;}
 if( o == 2)
     {cout<<fecha1.getDia();
      cout<<".";
      cout<<fecha1.getMes();
      cout<<".";
      cout<<fecha1.getAnio();}
 getch();
 
}

NOTA: El "mostrar comun" lo hice para comprobar que la fecha esté guardada correctamente como metodo seguro.

Estoy usando Dev C++ 4.9.9.2 con MinGW 3.4.2

errores que me da:

3 C:\Users\*usuario*\Desktop\Programación\lab2.cpp In file included from C:\Users\*usuario*\Desktop\Programación\lab2.cpp
18 C:\Users\*usuario*\Desktop\Programación\Fecha2.h ISO C++ forbids declaration of `ostream' with no type
18 C:\Users\*usuario*\Desktop\Programación\Fecha2.h expected `;' before '&' token

Espero me puedan dar una mano, soy un tanto nuevo en esto jeje. Gracias de antemano!


Título: Re: Error con sobrecarga de Ostream
Publicado por: Akai en 1 Abril 2011, 18:56 pm
No puedes retornar 0 a un stream. Tu sobrecarga del operador << es:
Código
  1. ostream &operator << (ostream o, Fecha f);

Por tanto, no puedes hacer un return 0 al ifnal de la sobrecarga. Has de retornar el ostream " o " en tu caso.

Por otro lado, tienes un lio de includes ahí:

Si defines la clase fecha en fecha.h, lo normal sería implementarla en fecha.cpp, no en el main. Por tanto, lo "ideal" sería: main.cpp (o el nombre que sea), fecha.h, fecha.cpp. Fecha .cpp no hace falta que lo incluyas en el código, sino en la compilación.

Por otro lado, si declaras un ostream en fecha.h, incluye el iostream ahí, y como incluyes fecha.h en fecha.cpp, iostream estará también incluida en fecha.cpp

iostream.h es una cabecera obsoleta, se incluye como iostream a secas, sin la h. stdio.h es la cabecera para stdio de C, en c++ es cstdio otra vez sin la h.


EJEMPLO:
Código
  1. #ifndef fecha_H_INCLUDED
  2. #define fecha_H_INCLUDED
  3. //fecha.h
  4. #include <iostream>
  5. #include <cstdio>
  6.  
  7. //declaración de la clase y métodos
  8.  
  9. #endif // final del define de fecha_H_INCLUDED .
  10. //Esto se hace para evitar tener la misma librería incluida varias veces
  11.  

Código
  1. //fecha.cpp
  2. #include fecha.h
  3.  
  4. //implementación de los métodos

Código
  1. //main
  2.  
  3. #include fecha.h
  4.  

conio.h es una cabecera totalmente innecesaria y obsoleta: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html



Título: Re: Error con sobrecarga de Ostream
Publicado por: progTata en 6 Abril 2011, 22:55 pm
Gracias por la ayuda!! Eso fue lo que estaba necesitando. Con respecto a los fecha.cpp y eso tienes razón, sólo que esta vez estoy trabajando en gurpo y decidimos hacerlo asi, recien estamos empezando con el tema. Gracias por tu tiempo y un abrazo!