[C con Clase] Otra duda

Miguel Alejandro Jimenez Ramirez cerberbero en gmail.com
Jue Mar 20 17:11:35 CET 2014


Buneo finalmente logre solucionar estas duda muchas gracias por la
ayuda recibida , sin embargo hoy tengo una situacion un tanto
particular.


A ver tengo el siguiente codigo:


#include <iostream>
#include <string>
#include <vector>
using namespace std;

// Pour simplifier
typedef string Forme   ;
typedef string Couleur ;

class Brique
{
private:
  Forme   forme   ;
  Couleur couleur ;

public:
  /*****************************************************
    Modificar a partir de aqui
  *******************************************************/
Brique (Forme a, Couleur b):forme(a),couleur(b){}

Forme get_forme()const{return forme;}
Couleur get_coleur() const{return couleur;}

ostream& afficher(ostream& sortie) const
{
    sortie<<"( "<<forme<<" , "<<couleur<<" )"<<endl;
    return sortie;
    }
};
ostream& operator <<(ostream& sortie , Brique const & val)
{
return val.afficher(sortie);
}

class Construction
{
friend class Grader;
private:

vector<vector<vector<Brique>>> contenu;

public:
Brique get_brique()const {return contenu[0][0][0];}
Construction (Brique a);

  ostream& afficher(ostream& sortie) const
  {
    sortie<< contenu[0][0][0];
    return sortie;
   }
};
ostream& operator <<(ostream& sortie , Construction const & tmp)
{
      for(int i(0); i < (int)tmp.contenu.size(); i++) {
      for(int j(0); j < (int)tmp.contenu[i].size(); j++) {
      for(int k(0); k < (int)tmp.contenu[i][j].size(); k++) {
      return tmp.contenu[i][j][k].afficher(sortie);  }}}
}

Construction::Construction(Brique a):contenu (1, vector < vector <
Brique > > (1,vector<Brique> (1, a))) {}
/*******************************************
 * No modificar nada apraitr de esta linea.
 *******************************************/

int main()
{
  // Modèles de briques
  Brique toitD("obliqueD", "rouge");
  Brique toitG("obliqueG", "rouge");
  Brique toitM(" pleine ", "rouge");
  Brique mur  (" pleine ", "blanc");
  Brique vide ("                 ", "");

  unsigned int largeur(4);
  unsigned int profondeur(3);
  unsigned int hauteur(3); // sans le toit
  // on construit les murs
  Construction maison( hauteur / ( profondeur % (largeur * mur) ) );

  return 0;
}





Es un ejercicio bien extenso pero por ahora estoy resolviendolo por
partes , por eso no les envio todo el codigo , buneo mi duda es la
siguiente , en el metodo de Construction :

  ostream& afficher(ostream& sortie) const
  {
    sortie<< contenu[0][0][0];
    return sortie;
   }

La verdad esta implementacion no esta bien hecha , y lo se pero no se
como hacerla , la idea es que cuando utilica el operador << con algun
objeto de la clase Construction , tenga que ver un vector de 1X1X1 ,
es un vector 3D , por lo tanto si lo que quiero es ver un solo
elemento de la clase Construction entonces seria como ver tres de la
clase Brique ,
Respecto a la clase Brique , funciona muy bien ,no he tenido problemas
para ver los objetos de esta clase pero para la clase Construction ,
no se como hacerlo , de verdad que esto de los vectores en tres
dimensiones me esta dando muy duro , alguna idea de como hacerlo??

Gracias

2014-03-18 22:21 GMT+01:00 Salvador Pozo <salvador en conclase.net>:
> 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
> _______________________________________________
> 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.




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