[C con Clase] Otra duda

Salvador Pozo salvador en conclase.net
Mar Mar 18 22:21:39 CET 2014


El pasado 2014-03-18 11:01:56, Miguel Alejandro jimenez escribió:
 
MAj> Bueno pues la verdad es que sigo con dudas , ahora es sobre todo en la
MAj> sobre carga de operadores , tengo el siguiente codigo:

Hola, veamos:

Veo algunos errores en las declaraciones de operadores y funciones.

MAj> Flacon (string n,double v , double p):nom(n), volume(v), pH(p){}
MAj> 
MAj> ostream& print(ostream& out)const;
MAj> 
MAj> ostream& etiquette(ostream& sortie) const{
MAj>     sortie<<nom << " : " << volume << " ml, pH "<< pH ;
MAj>     return sortie;
MAj>     }
MAj> };
MAj> ostream& Flacon::print(ostream& cout)const
MAj> {
MAj>      cout << cout;
MAj>      return cout;
MAj>     }

ostream& Flacon::print(ostream& out)const
{
     out << nom << " : " << volume << " ml, pH " << pH;
     return out;
}

El método "print" no tiene sentido tal como lo has definido, además, no me parece buena idea usar como identificador de parámetro la palabra "cout".

He creado una versión, que por lo demás, es idéntica a "etiquette".

MAj> const ostream& operator<<(ostream& out, Flacon c )
MAj> {
MAj>      c.print(out);
MAj>      return out;
MAj> 
MAj>     }

En el prototipo la referencia retornada por el operador << no puede ser constante, sin embargo, tu la declaras como tal. Eso provoca errores al intentar asociar el operador con diferentes parámetros.

También es preferible usar una referencia constante al objeto "Flacon", en lugar de pasarlo por copia.
 
ostream& operator<<(ostream& out, const Flacon& c )
{
     return c.print(out);
}

MAj> Bueno pues tengo varias dudas sobre este codigo:
MAj> 
MAj> 1. Si bien declaro eloperador << como externo y lo sobre cargo en el
MAj> metodo etiquette que recibe como parametro una referencia a un objeto
MAj> de la clase oestream , no se como hacer para que en la funcion
MAj> afficher_melanger(), pueda imrimir los objetos de la clase Flacon sin
MAj> necesidad de llamar al metodo etiquete , y en vista de que no puedo
MAj> modificar esta funcion pues estoy obligado a hacerlo asi.

No entiendo esta duda. El operador no puede acceder a miembros privados de la clase Flacon, ya que no son clases amigas. De modo que estás obligado a usar su interfaz, es decir, alguna de sus funciones públicas: etiquette o print.

MAj> 2. Creeria que la solucion al punto 1 esta en la funcion print() ya
MAj> que aqui si podria utilizar la funcion etiquette , pero la verdadno
MAj> tengo claro como.

Dado que ambos métodos son públicos, no veo por qué no puedes usar cualquiera de ellos. :/

MAj> Podria alguien darme una guia de como hacer este programa.

¿Cuál es el objetivo del programa?

Por cierto, que la declaración de "afficher_melange" creo que es incorrecta. 

MAj> void afficher_melange(Flacon const& f1, Flacon const& f2) 

Debería ser:
void afficher_melange(const Flacon& f1, const Flacon& f2)

¿O no?

Lo siento, no puedo ser más preciso en las respuestas, dado que desconozco el objetivo del programa.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net


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