Ver Mensaje Individual
  #8 (permalink)  
Antiguo 01/04/2014, 10:49
CalgaryCorpus
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problema con set

Parece todo bien, excepto que no funciona.
Tomando todo el codigo que ofreces, hay varias clases desconocidas, las que deben ser culpables, o bien es el operator <<.
Para comprobarlo mira este codigo, tomado del codigo que has copiado aqui, pero que incluye clases vacias "Clave" y "Fecha", supone que "Cadena" es un string, y borré la clase Articulo y toda referencia a ella, borre gran parte del main().

Código C++:
Ver original
  1. #include <map>
  2. #include <set>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. typedef string Cadena;
  8.  
  9. class Clave {
  10. public:
  11.   Clave( string s ) {}
  12.   string clave() const { return ""; }
  13. };
  14.  
  15. class Fecha
  16. {
  17. public:
  18.   Fecha( int x, int y, int z ) {}
  19. };
  20.  
  21. class Usuario {
  22.  public:
  23.   //CONSTRUCTOR Y DESTRUCTOR
  24.   Usuario (const Cadena&, const Cadena&, const Cadena&, const Cadena&, const char*);
  25.   //~Usuario(); Aún no esta hecho
  26.  
  27.   class Id_duplicado {
  28.   public:
  29.     Id_duplicado (const Cadena& id) : id_duplicado(id) {}
  30.     const Cadena idd() { return id_duplicado; }
  31.   private:
  32.     const Cadena id_duplicado;
  33.   };
  34.  
  35.   //FUNCIONES OBSERVADORAS
  36.   Cadena id() const { return identificador_; }
  37.   Cadena nombre() const { return nombre_; }
  38.   Cadena apellidos() const { return apellidos_; }
  39.   Cadena direccion() const { return direccion_; }
  40.   Cadena password() const { return (*this).password_.clave(); }
  41.  
  42.   //FUNCIONES CON TARJETAS
  43.   /* Aún no implementadas
  44.   void es_titular_de(Tarjeta&);
  45.   void no_es_titular_de(Tarjeta&);
  46.   const Tarjetas& tarjetas() const;
  47.   */
  48.  
  49.   //SOBRECARGA OPERADOR
  50.   friend std::ostream& operator << (std::ostream&, const Usuario&);
  51.  
  52.  private:
  53.   Cadena identificador_;
  54.   Cadena nombre_;
  55.   Cadena apellidos_;
  56.   Cadena direccion_;
  57.   Clave password_;
  58.   //  typedef map<Numero, Tarjeta*> Tarjetas;
  59.   //   Tarjetas tarjetas_;
  60.  
  61.   static set<Cadena> identificadores;
  62.   bool IdValido() const throw(Usuario::Id_duplicado);
  63.   Usuario (const Usuario&); //Deshabilitamos la copia de un usuario
  64. };
  65.  
  66. set<Cadena> Usuario::identificadores;
  67.  
  68. Usuario::Usuario (const Cadena& identificador, const Cadena& nombre, const Cadena& apellidos, const Cadena& direccion, const char* pass) : identificador_(identificador), nombre_( nombre), apellidos_(apellidos), direccion_(direccion), password_(pass) {
  69.  
  70.   IdValido();
  71. }
  72.  
  73. bool Usuario::IdValido() const throw(Usuario::Id_duplicado) {
  74.   pair<set<Cadena>::iterator,bool> i;
  75.  
  76.   i = identificadores.insert(id());
  77.   if (i.second == false) {
  78.     throw(Id_duplicado(id()));
  79.     return false;
  80.   } else {
  81.     cout << " Usuario con id " << id() << " aceptado" << endl;
  82.     return true;
  83.   }
  84. }
  85.  
  86. int main() {
  87.   try {
  88.     Usuario yo("1","Jose Ramon","Gago Gomez","Paseo del prado","joseramon");
  89. //    cout << yo << endl;
  90.     Usuario yo1("2","Jose Ramon","Gago Gomez","Paseo del prado","joseRamon");
  91. //    cout << yo1 << endl;
  92.   }
  93.   catch (Usuario::Id_duplicado e) {
  94.     cerr << "Excepcion: ID (" << e.idd() << ") duplicado" << endl;
  95.   }
  96.  
  97.   return 0;
  98. }

Tu mision:
Prueba que este programa efectivamente funciona.
Incorpora las distintas clases anuladas a este codigo y prueba el main despues de cada reemplazo, sin modificaciones con la idea de solo ejercitar el constructor. Reemplaza una por una.
Luego, incorpora el operator <<
(o al inicio, como te parezca mejor), descomentando las lineas del main que la usan.

Al final incorpora el resto del main que borré.

Si descubres el error en este camino será bueno saber quien era el culpable.
Espero lo puedas compartir despues.
__________________
Visita mi perfil en LinkedIn