[C con Clase] que no compila

carlos martinez gadea tupy4 en hotmail.com
Vie Mayo 29 10:23:07 CEST 2009


Mmm...no se si me equivoco, pero...el operator << debe ser friend, como lo tienes puesto, pero nada de ponerlo en private, y tampoco en public. 
Yo cuando redefino el operador << lo que hago es esto:

class complejo {
        friend std::ostream& operator << (ostream& output, const complejo& z);

	public:
		complejo (double aa=0.0, double bb=0.0);
		complejo operator +(const complejo& z);
 
	private:
		double a,b;
 
	};

De todas formas, casualmente, me coges con una clase TComplejo que he usado a lo largo de este año, en la universidad. 
La declaración de la misma es la que sigue, ten en cuenta que tengo unos cuantos métodos más que no te sirven, 
pero para que te hagas una idea de donde definir el operator <<:

class TComplejo{
	friend bool operator<(const TComplejo&,const TComplejo&);
	friend bool operator>(const TComplejo&,const TComplejo&);
	friend TComplejo operator+(const double,const TComplejo&);
	friend TComplejo operator-(const double,const TComplejo&);
	friend TComplejo operator*(const double,const TComplejo&);
	friend ostream& operator<<(ostream &,const TComplejo &);
	private:
		double re;
		double im;
	public:
		TComplejo(double = 0,double = 0);
		TComplejo(const TComplejo&);
		~TComplejo();
		TComplejo& operator=(const TComplejo&);
		TComplejo operator+(const TComplejo&);
		TComplejo operator-(const TComplejo&);
		TComplejo operator*(const TComplejo&);
		TComplejo operator+(const double);
		TComplejo operator-(const double);
		TComplejo operator*(const double);
		bool operator==(const TComplejo&) const;
		bool operator!=(const TComplejo&);
		double Re() const;  //Devuelve parte real
		double Im() const;  //Devuelve parte imaginaria
		void Re(double); //Modifica parte real
		void Im(double); //Modifica parte imaginaria
		double Arg(void) const;
		double Mod(void) const; //Calcula el módulo
		
};

Esta clase, te adelanto, que es totalmente funcional. Un saludo y espero que te sirva algo de todo esto. ;)


> To: cconclase en listas.conclase.net
> From: ddagnino en gmail.com
> Date: Wed, 27 May 2009 17:23:45 +0200
> Subject: [C con Clase] que no compila
> 
> Hola gente,
> estoy empezando a programar con clases y me he roto la cabeza buscando errores en el siguiente programa, haber si me podéis echar un cable.
> 
> El main.cpp es:
> #include <cstdlib>
> 
> #include <iostream>
> #include <cmath>
> #include "complejos.h"
> 
> using namespace std;
> 
> 
> 
> int main(){
> 
> complejo z1(1.,2.),z2(3.,4.);
> cout << "z1 =  " << z1 << endl;
> cout << "z2 =  " << z2 << endl;
> cout << "z1+z2 =  " << z1+z2 << endl;
> 
> getchar();
>  return 0;
> 
> }
> 
> El complejos.h es:
> #ifndef _COMPLEJOS_H_
> 
> #define _COMPLEJOS_H_
> 
> 
> class complejo {
> 	public:
> 		complejo (double aa=0.0, double bb=0.0);
> 		complejo operator +(const complejo& z);
> 
> 	private:
> 		friend std::ostream& operator << (ostream& output, const complejo& z);
> 
> 		double a,b;
> 
> 	};
> 
> #endif
> 
> Y el complejos.cpp es:
> #include <iostream>
> #include <cmath>
> #include "complejos.h"
> using namespace std;
> 
> inline complejo::complejo (double aa, double bb): a(aa), b(bb) {}
> 
> inline std::ostream& operator << (ostream& output, const complejo& z){
> 	output << z.a << " " << z.b;
> 	return output;
> 	}
> 
> 
> inline complejo complejo::operator +(const complejo& z){
> 
>    complejo temp (a+z.a , b+z.b);
> 
>    return temp;
> 
>    }
> 
> El Makefile es (creo que no hace falta pero yo lo meto):
> CXX = g++
> CCFLAGS = -g -Wall
> 
> myproj: main.o complejos.o
> 	$(CXX) $(CCFLAGS) -o myproj main.o complejos.o
> 
> complejos.o: complejos.cpp complejos.h
> 	$(CXX) $(CCFLAGS) -c complejos.cpp
> 
> main.o: main.cpp complejos.h
> 	$(CXX) $(CCFLAGS) -c main.cpp
> 
> El error al compilar es enorme así que no lo pongo, aun así lo que si me dice al principio es literalmente "la declaración de ‘operator<<’ como algo que no es función". He buscado en internet y he probado mil formas de escribir lo mismo pero siempre me peta al compila. Bueno, ya se que quizás estoy pidiendo mucho pero cualquier ayuda es bienvenida.
> Saludos y gracias de ante mano,
> Dani.
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

_________________________________________________________________
¡Acelera con la Fórmula 1! Juega y demuestra lo que sabes con MSN Deportes
http://msn.es.predictorpro.com/grand-prix/overview.aspx?season=8 
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090529/4599015f/attachment.html>


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