[C con Clase] Sobrecarga de operador <<

Davidson, Steven srd4121 en njit.edu
Lun Ene 28 08:57:21 CET 2013


Hola José,

2013/1/28 José <enriquez.ja en hotmail.com>

> Hola, es mi primera intervención, me ha ayudado mucho este curso, y sigo
> aprendiendo, y gracias por la ayuda, mi duda es:
>

Ante todo, bienvenido a la lista de correo-e.

Tengo un programa dividido en tres parte, un fichero que declara una clase,
> otro que define todas las funciones miembro y sobrecarga de operadores, y
> otro con el programa principal con la función main, lo que pasa es que
> tengo declarada la sobrecarga del operador de flujo de salida << de la
> siguiente manera:
>
> friend ostream& operator<< (ostream& os, const claseA&);
>
> Tambien tengo implementada la funcion de sobrecarga, pero al compilar me
> manda un error que dice ISO C++ prohibe la declaracion de ostream sin tipo,
> y tambien que no es ni funcion ni funcion miembro y que no puede ser
> declarada como friend.
>
>
Esto significa que se ha topado con 'ostream' y no tiene ni idea de qué es
'ostream', pero parece que estás intentando definirla dentro de esta
declaración.

Solucioné esto declarando el using namespace std; en el fichero que la
> declara la clase y funciona todo bien, mi duda es porque debo hacer esta
> declaración aun y cuando ya la tengo declarada en el fichero del programa
> principal? Y ¿existe otra manera de hacer la


Porque existe dos ficheros fuente. El compilador compila - valga la
redundancia - cada fichero fuente por separado. El enlazador es quien liga
o enlaza los ficheros compilados llamados "objeto" junto con las
bibliotecas. Estás #incluyendo el fichero de cabecera de la clase en dos
ficheros fuente diferentes: en el de "main" y en el de la definición de las
funciones miembro de la clase.

En general, sugiero #incluir todos los ficheros de cabecera que necesites
para definir cada fichero fuente o de cabecera, sin pensar en el uso de tal
fichero fuente o de cabecera. No pienses en las dependencias creadas por la
inclusión de "este fichero" en otros ficheros; sólo piensa en las
necesidades de "este fichero". Por ejemplo,

// algo.h
#include <iostream>
#include <string>

class Algo
{
private:
  std::string str;

public:
  Algo( std::string &ref );
  Algo( std::istream &is );
};

// algo.cpp
#include <iostream>
#include <string>
#include "algo.h"

Algo::Algo( std::string &ref )
{
  ...
}

Algo::Algo( std::istream &is )
{
  ...
}


Como necesitamos 'string' e 'istream' en "algo.h", incluimos sus ficheros
de cabecera. Lo mismo sucede en "algo.cpp". No sugiero pensar que como
incluye "algo.h", no tiene que incluir los otros dos ficheros de cabecera,
sino piensa en lo que necesita "algo.h" y lo que necesita "algo.cpp" en
cada fichero.

declaracion de sobrecarga sin declarar el namespace std? algo asi como se
> usa en std::cout. Solo quiero salir de la duda agradezco la ayuda que me
> puedan dar.
>

Ciertamente, puedes usar 'std::' explícitamente. De hecho, es aconsejable
hacer esto. La idea de usar espacios denominados (o con nombre) es que no
"contaminamos" el espacio global. Al declarar: 'using nampespace std',
estamos haciendo eso mismo: contaminar la globalidad al incluir 'std' en
ella.

A la hora de escribir las versiones finales de nuestros proyectos, deberías
usar 'std::' explícitamente.


Espero haber aclarado las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130128/33b02648/attachment.html>


Más información sobre la lista de distribución Cconclase