[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