[C con Clase] Otra duda
Miguel Alejandro Jimenez Ramirez
cerberbero en gmail.com
Mar Mar 18 12:01:56 CET 2014
Bueno pues la verdad es que sigo con dudas , ahora es sobre todo en la
sobre carga de operadores , tengo el siguiente codigo:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
class Flacon
{
private:
string nom;
double volume;
double pH;
public:
/*****************************************************
Solo puedo modificar elcodigo apartir de aqui
*******************************************************/
Flacon (string n,double v , double p):nom(n), volume(v), pH(p){}
ostream& print(ostream& out)const;
ostream& etiquette(ostream& sortie) const{
sortie<<nom << " : " << volume << " ml, pH "<< pH ;
return sortie;
}
};
ostream& Flacon::print(ostream& cout)const
{
cout << cout;
return cout;
}
const ostream& operator<<(ostream& out, Flacon c )
{
c.print(out);
return out;
}
/*******************************************
* No puedo modificar nada despues de esta linea
*******************************************/
void afficher_melange(Flacon const& f1, Flacon const& f2)
{
cout << "Si je mélange " << endl;
cout << "\t\"" << f1 << "\"" << endl;
cout << "avec" << endl;
cout << "\t\"" << f2 << "\"" << endl;
cout << "j'obtiens :" << endl;
//cout << "\t\"" << (f1 + f2) << "\"" << endl;
}
int main()
{
Flacon flacon1("Eau", 600.0, 7.0);
Flacon flacon2("Acide chlorhydrique", 500.0, 2.0);
Flacon flacon3("Acide perchlorique", 800.0, 1.5);
afficher_melange(flacon1, flacon2);
afficher_melange(flacon2, flacon3);
return 0;
}
Bueno pues tengo varias dudas sobre este codigo:
1. Si bien declaro eloperador << como externo y lo sobre cargo en el
metodo etiquette que recibe como parametro una referencia a un objeto
de la clase oestream , no se como hacer para que en la funcion
afficher_melanger(), pueda imrimir los objetos de la clase Flacon sin
necesidad de llamar al metodo etiquete , y en vista de que no puedo
modificar esta funcion pues estoy obligado a hacerlo asi.
2. Creeria que la solucion al punto 1 esta en la funcion print() ya
que aqui si podria utilizar la funcion etiquette , pero la verdadno
tengo claro como.
Podria alguien darme una guia de como hacer este programa.
Gracias, un saludo
2014-03-13 19:38 GMT+01:00 Miguel Alejandro Jimenez Ramirez
<cerberbero en gmail.com>:
> De hecho si ese era el error , la inicializacion de las referencias , en el
> ejemplo no puse todo el codigo paro es cierto que tenia un constructor en
> machin que inicializaba las referencias , despues lo que hice en el
> constructor copia fue lo siguiente
>
> XXX(XXX const &a):z(a.z){cout<<a.z.get();}
>
> Algo asi , y funciono bien , muchas gracias or la ayuda seguire preguntando
> pero ya con otros ejercicios ,
>
> hasta pronto
>
>
> 2014-03-13 19:06 GMT+01:00 Salvador Pozo Coronado <salvador en conclase.net>:
>
>> Estimado Miguel,
>>
>> Bueno, veo varios problemas, no sólo en el constructor copia de XXX,
>> sino también en el constructor a partir de machin.
>>
>> En la clase machin, uno de los miembros es una referencia constante a
>> un objeto de la clase X.
>>
>> Las referencias no se pueden dejar sin asignar, de modo que es
>> obligatorio declarar un constructor para machin que inicialice
>> esa referencia con un valor válido. Por poner un ejemplo:
>>
>> machin(const X& x): refX(x), b() {}
>>
>> No existe un constructor para machin que use como parámetro una
>> referencia constante a un objeto machin. El que he definido en antes
>> usa una referencia a X, y es el único contructor.
>>
>> Además, igual que con machin, debemos inicializar todas las
>> referencias que existan, en este caso, refmachin. Una opción sería
>> esta:
>>
>> XXX(machin const & p):z(p.getX()),refmachin(p) { cout<< z.getb();} //
>> pas de problème
>>
>> El el otro constructor de XXX pasa lo mismo, necesitamos inicializar
>> obligatoriamente todas las referencias, y este es el mensaje de error
>> que recibes "referencia no inicializada".
>>
>> Como también hay que inicializar z, de la clase machin, y esa clase no
>> tiene constructor copia, tendremos que usar el constructor disponible:
>>
>> XXX(XXX const &xxx) : z(xxx.z.getX()), refmachin(xxx.refmachin) {
>> cout<<z.getb();}
>>
>> En definitiva, no sé qué errores son producto del ejemplo, pero el
>> error que comentas es por no inicializar las referencias.
>>
>> Recuerda que siempre es obligatorio inicializar las referencias.
>>
>> Hasta pronto.
>> --
>> Saludos,
>> Salvador mailto:salvador en conclase.net
>> Con Clase: http://www.conclase.net
>> Blog con Clase: http://blogconclase.wordpress.com
>>
>>
>> _______________________________________________
>> 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
>
>
>
>
> --
> MIGUEL ALEJANDRO JIMENEZ R.
--
MIGUEL ALEJANDRO JIMENEZ R.
Más información sobre la lista de distribución Cconclase