Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema con set

Estas en el tema de Problema con set en el foro de C/C++ en Foros del Web. A ver, he creado una clase usuario para gestionar usuarios que tengan un id único, es por esto que en la parte privada de mi ...
  #1 (permalink)  
Antiguo 01/04/2014, 07:44
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Problema con set

A ver, he creado una clase usuario para gestionar usuarios que tengan un id único, es por esto que en la parte privada de mi clase he hecho la siguiente declaración:

Código C++:
Ver original
  1. static set<Cadena> identificadores;

(El tipo cadena es una clase que he creado, que tiene las mismas características que un string).

Esta variable estática se inicializa a parte en un .cpp del siguiente modo:

Código C++:
Ver original
  1. set<Cadena> Usuario::identificadores;

Aquí muestro la función de construcción de usuario:

Código C++:
Ver original
  1. 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) {
  2.  
  3.   IdValido();
  4. }

y aquí la función IdValido() que la idea principal es que ya que, según lei, set::insert devuelve un tipo pair formado por un iterador y un tipo bool, inserto el id nuevo y si existe pues se lanza una excepción y si no existe pues se agrega el nuevo usuario:

Código C++:
Ver original
  1. bool Usuario::IdValido() const throw(Usuario::Id_duplicado) {
  2.   pair<set<Cadena>::iterator,bool> i;
  3.  
  4.   i = identificadores.insert(id());
  5.   if (i.second == false) {
  6.     throw(Id_duplicado(id()));
  7.     return false;
  8.   } else {
  9.     return true;
  10.   }
  11. }

Si compilo (compilando con g++ en Linux), obtengo un bad_alloc y según he estado viendo se produce al entrar a la función IdValido(). ¿Alguien me puede decir la razón?
  #2 (permalink)  
Antiguo 01/04/2014, 08:41
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con set

Tal vez el problema está en el codigo que NO estas mostrando.
¿Puedes incluir tambien el codigo que usa la clase Usuario, o el codigo de id() ?
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 01/04/2014, 09:38
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con set

USUARIO.H
Código C++:
Ver original
  1. #ifndef _USUARIO_H_
  2. #define _USUARIO_H_
  3.  
  4. #include "cadena.h"
  5. #include "clave.h"
  6. #include "articulo.h"
  7. #include <map>
  8. #include <set>
  9. using std::map;
  10. using std::set;
  11.  
  12. class Usuario {
  13.  public:
  14.   //CONSTRUCTOR Y DESTRUCTOR
  15.   Usuario (const Cadena&, const Cadena&, const Cadena&, const Cadena&, const char*);
  16.   //~Usuario(); Aún no esta hecho
  17.  
  18.   class Id_duplicado {
  19.   public:
  20.     Id_duplicado (const Cadena& id) : id_duplicado(id) {}
  21.     const Cadena idd() { return id_duplicado; }
  22.   private:
  23.     const Cadena id_duplicado;
  24.   };
  25.   //FUNCIONES OBSERVADORAS
  26.   Cadena id() const { return identificador_; }
  27.   Cadena nombre() const { return nombre_; }
  28.   Cadena apellidos() const { return apellidos_; }
  29.   Cadena direccion() const { return direccion_; }
  30.   Cadena password() const { return (*this).password_.clave(); }
  31.  
  32.   //FUNCIONES CON TARJETAS
  33.   /* Aún no implementadas
  34.   void es_titular_de(Tarjeta&);
  35.   void no_es_titular_de(Tarjeta&);
  36.   const Tarjetas& tarjetas() const;
  37.   */
  38.  
  39.   //FUNCIONES CON LOS ARTICULOS
  40.   typedef map<Articulo*, unsigned> Articulos;
  41.   void compra(Articulo&, unsigned);
  42.   const Articulos& compra() const { return articulos_; }
  43.   size_t n_articulos() const { return articulos_.size(); }
  44.  
  45.   //SOBRECARGA OPERADOR
  46.   friend std::ostream& operator << (std::ostream&, const Usuario&);
  47.  
  48.  private:
  49.   Cadena identificador_;
  50.   Cadena nombre_;
  51.   Cadena apellidos_;
  52.   Cadena direccion_;
  53.   Clave password_;
  54.   //  typedef map<Numero, Tarjeta*> Tarjetas;
  55.   //   Tarjetas tarjetas_;
  56.   Articulos articulos_;
  57.  
  58.   static set<Cadena> identificadores;
  59.   bool IdValido() const throw(Usuario::Id_duplicado);
  60.   Usuario (const Usuario&); //Deshabilitamos la copia de un usuario
  61. };
  62.  
  63. void mostrar_carro(const Usuario&); //Falta cambiarlo a flujo de salida
  64. //inline const Tarjetas& tarjetas() const { return tarjetas_; }
  65.  
  66. #endif

USUARIO.CPP
Código C++:
Ver original
  1. #include "usuario.h"
  2. #include <iostream>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. set<Cadena> Usuario::identificadores;
  8.  
  9. 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) {
  10.  
  11.   IdValido();
  12. }
  13.  
  14. bool Usuario::IdValido() const throw(Usuario::Id_duplicado) {
  15.   pair<set<Cadena>::iterator,bool> i;
  16.  
  17.   i = identificadores.insert(id());
  18.   if (i.second == false) {
  19.     throw(Id_duplicado(id()));
  20.     return false;
  21.   } else {
  22.     return true;
  23.   }
  24. }

El problema creo que está seguro al 100% en la función IdValido(), puesto que si la pongo como comentario o hago que siempre haga return true; el programa funciona correctamente

Última edición por DvNe; 01/04/2014 a las 10:02
  #4 (permalink)  
Antiguo 01/04/2014, 10:08
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con set

Aun no incluyes el codigo que usa la clase Usuario. Solo pusiste el código de ella. Creo que eso ayudará a completar el cuadro.
__________________
Visita mi perfil en LinkedIn
  #5 (permalink)  
Antiguo 01/04/2014, 10:09
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con set

Código C++:
Ver original
  1. #include "usuario.h"
  2. #include <iostream>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. set<Cadena> Usuario::identificadores;
  8.  
  9. 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) {
  10.   IdValido();
  11. }
  12.  
  13. bool Usuario::IdValido() const throw(Usuario::Id_duplicado) {
  14.  
  15. }
  16.  
  17. ostream& operator << (ostream& output, const Usuario& user) {
  18.   output << user.id() << " [" << user.password() << "] " << user.nombre() << " "
  19.      << user.apellidos() << "\n" << user.direccion() << "\nTarjetas:\n";
  20.   /* for (Tarjetas::iterator i = tarjetas.begin(); i != tarjetas.end(); ++i)
  21.      output << (*i).second << "\n";*/
  22.   return output;
  23. }
  24.  
  25. void Usuario::compra (Articulo& articulo, unsigned cant = 1) {
  26.   if (cant == 0)
  27.     articulos_.erase(&articulo);
  28.   else
  29.     articulos_.insert(pair<Articulo*,unsigned>(&articulo,cant));
  30. }
  31.  
  32. void mostrar_carro(const Usuario& user) {
  33.  
  34.   cout << "Carrito de la compra de " << user.nombre() << " [Articulos: "
  35.        << user.n_articulos() << "]\n Cant. Articulo\n================="
  36.        << "=========================================\n";
  37.   for (Usuario::Articulos::const_iterator  p = user.compra().begin(); p != user.compra().end(); p++)
  38.     cout << setfill(' ') << setw(4) <<  p->second << setw(4) << *p->first << "\n";
  39. }

Este es el .CPP íntegro de USUARIO no hay nada mas. ¿Quieres que suba el Cadena.cpp?
  #6 (permalink)  
Antiguo 01/04/2014, 10:14
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con set

Parece que no logro comunicarme.
El codigo que usa a la clase Usuario NO ES el codigo que implementa a la clase Usuario.

Debe ser algo asi como

Usuario u;
u.metodos();

o cualquier codigo que tengas que instancie objetos de esa clase.

Perdon por las confusiones.
__________________
Visita mi perfil en LinkedIn
  #7 (permalink)  
Antiguo 01/04/2014, 10:31
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con set

Ah claro fallo mio también ya estoy saturado que no encuentro la solución y ya estoy mareado de probar cosas jejeje. La clase usuario la utilizo en un main de prueba en el que voy probando las clases que voy añadiendo, aquí pongo el código:

Código C++:
Ver original
  1. #include "usuario.h"
  2. #include "clave.h"
  3. #include "articulo.h"
  4. #include "numero.h"
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9.   try {
  10.     Usuario yo("1","Jose Ramon","Gago Gomez","Paseo del prado","joseramon");
  11.     cout << yo << endl;
  12.     Usuario yo1("2","Jose Ramon","Gago Gomez","Paseo del prado","joseRamon");
  13.     cout << yo1 << endl;
  14.    
  15.     Fecha f1(0,0,1998);
  16.     Articulo art1("110","Fundamentos de C++",f1,29.95,1);
  17.     Fecha f2(0,0,2002);
  18.     Articulo art2("111","Fundamentos BD",f2,25,50);
  19.     try {
  20.       Numero numer(" 123456  78123  45670  ");
  21.       cout << numer << "\n";
  22.       Numero numer1("4417 1234 56789 113  ");
  23.       cout << numer1 << "\n";
  24.       cout << boolalpha << (numer < numer1) << endl;
  25.       cout << boolalpha << (numer1 < numer) << endl;
  26.     } catch (Numero::Incorrecto e) {
  27.       cerr << "Excepcion: NUMERO (" << e.razon() << ")"<<endl;
  28.     }
  29.     yo.compra(art1,21);
  30.     yo.compra(art2,3);
  31.     Usuario::Articulos::const_iterator p = yo.compra().begin();
  32.     while (p != yo.compra().end()) {
  33.       cout << *p->first << " |" << p->second << "\n";
  34.       p++;
  35.     }
  36.    
  37.     mostrar_carro(yo);
  38.    } catch (Usuario::Id_duplicado e) {
  39.     cerr << "Excepcion: ID (" << e.idd() << ") duplicado" << endl;
  40.   }
  41.   return 0;
  42. }
  #8 (permalink)  
Antiguo 01/04/2014, 10:49
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 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
  #9 (permalink)  
Antiguo 01/04/2014, 11:34
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con set

El fallo me lo da cuando agrego la clase Cadena. He aquí la definición de la clase

Código C++:
Ver original
  1. #ifndef _CADENA_
  2. #define _CADENA_
  3. #include <iostream>
  4. #include <stdexcept>
  5.  
  6. class Cadena {
  7.  public:
  8.   explicit Cadena (const size_t longitud = 0, const char cadena = ' ');
  9.   Cadena (const Cadena& );
  10.   Cadena (const char* );
  11.  
  12.   ~Cadena() {delete[] cadena_;}
  13.  
  14.   size_t longitud() const {return longitud_ - 1;}
  15.   char* c_str() const {return cadena_;}
  16.  
  17.   Cadena& operator = (const char*);
  18.   Cadena& operator = (const Cadena&);
  19.   Cadena& operator += (const Cadena&);
  20.  
  21.   char operator [] (int pos) const {return cadena_[pos];}
  22.   char& operator [] (int pos) {return cadena_[pos];}
  23.   char at(size_t) const throw (std::out_of_range);
  24.   char& at(size_t) throw (std::out_of_range);
  25.  
  26.   //  operator char*() const {return (*this).cadena_str();}
  27.   Cadena subcadena (int, int) const throw(std::out_of_range);
  28.  
  29.   friend std::ostream& operator << (std::ostream&, const Cadena&);
  30.   friend std::istream& operator >> (std::istream&, Cadena&);
  31.  private:
  32.   char *cadena_;
  33.   size_t longitud_;
  34. };
  35.  
  36. Cadena operator + (const Cadena&, const Cadena&);
  37.  
  38.  
  39. bool operator == (const Cadena&, const Cadena&);
  40. bool operator != (const Cadena&, const Cadena&);
  41. bool operator < (const Cadena&, const Cadena&);
  42. bool operator <= (const Cadena&, const Cadena&);
  43. bool operator > (const Cadena&, const Cadena&);
  44. bool operator >= (const Cadena&, const Cadena&);
  45. #endif

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstring>
  3. #include <stdexcept>
  4.  
  5. #include "cadena.h"
  6.  
  7. using namespace std;
  8.  
  9. Cadena::Cadena (const size_t longitud, const char caracter) : longitud_(longitud+1) {
  10.   cadena_ = new char[longitud_];
  11.   for (size_t i = 0; i < longitud; ++i)
  12.     cadena_[i] = caracter;
  13.   cadena_[longitud] = '\0';
  14. }
  15.  
  16. Cadena::Cadena (const Cadena &cadena1) : longitud_(cadena1.longitud() + 1){ // <------- AQUÍ ESTABA EL FALLO
  17.   cadena_ = new char[longitud_];
  18.   strcpy(cadena_,cadena1.c_str());
  19. }
  20.  
  21. Cadena::Cadena (const char *cadena) : longitud_(strlen(cadena) + 1){
  22.   cadena_ = new char[longitud_];
  23.   strcpy(cadena_,cadena);
  24. }
  25.  
  26. Cadena& Cadena::operator = (const char* cadena) {
  27.   longitud_ = strlen(cadena) + 1;
  28.   cadena_ = new char[longitud_];
  29.   strcpy(cadena_,cadena);
  30.   return (*this);
  31. }
  32.  
  33. Cadena& Cadena::operator = (const Cadena &cadena1) {
  34.   if (this != &cadena1) {
  35.     delete[] cadena_;
  36.     if (cadena1.c_str()) {
  37.       longitud_ = cadena1.longitud();
  38.       cadena_ = new char[longitud_];
  39.       strcpy(cadena_,cadena1.c_str());
  40.     }
  41.     else
  42.       cadena_ = NULL;
  43.   }
  44.   return (*this);
  45. }
  46.  
  47. Cadena& Cadena::operator += (const Cadena &cadena1) {
  48.   Cadena cadena2 (longitud() + cadena1.longitud() + 1);
  49.   strcpy(cadena2.cadena_,cadena_);
  50.   strcat(cadena2.cadena_,cadena1.cadena_);
  51.   (*this) = cadena2;
  52.   return (*this);
  53. }
  54.  
  55. char Cadena::at(size_t pos) const throw(std::out_of_range) {
  56.   if (pos < 0 || pos > longitud())
  57.     throw (std::out_of_range("Posicion fuera de rango"));
  58.   else if ((*this)[pos] == 0)
  59.     throw (std::out_of_range("Posicion inexistente"));
  60.   else
  61.     return (*this)[pos];
  62. }
  63.  
  64. char& Cadena::at(size_t pos) throw(std::out_of_range) {
  65.   if (pos < 0 || pos > longitud())
  66.     throw (std::out_of_range("Posicion fuera de rango"));
  67.   else if ((*this)[pos] == 0)
  68.     throw (std::out_of_range("Posicion inexistente"));
  69.   else
  70.     return (*this)[pos];
  71. }
  72.  
  73. Cadena operator + (const Cadena &cad1, const Cadena &cad2) {
  74.   Cadena aux(cad1);
  75.   aux += cad2;
  76.   return aux;
  77. }
  78. /* Tam_i no puede ser negativo */
  79. Cadena Cadena::subcadena (int pos_i, int tam_i) const  throw(std::out_of_range) {
  80.   if ((size_t) pos_i < 0 || (size_t) pos_i > longitud() - 1)
  81.     throw (std::out_of_range("Posicion inicial fuera de rango"));
  82.  
  83.   if (tam_i < 0 || (size_t) pos_i + tam_i > longitud())
  84.     throw (std::out_of_range("Posicion fuera de rango"));
  85.  
  86.   Cadena cadena (tam_i);
  87.   size_t i = 0;
  88.   for (size_t k = pos_i; k < (size_t) tam_i + pos_i; k++) {
  89.     cadena.at(i) = at(k);
  90.     i++;
  91.   }
  92.   return cadena;
  93. }
  94. /**
  95.  * strcmp(x,y)
  96.  * Si x == y return 0;
  97.  * Si x <  y return -1;
  98.  * Si x >  y return 1;
  99.  */
  100.  
  101. bool operator == (const Cadena &cad1, const Cadena &cad2) {
  102.   return !(strcmp(cad1.c_str(),cad2.c_str()));
  103. }
  104.  
  105. bool operator != (const Cadena &cad1, const Cadena &cad2) {
  106.   return !(cad1 == cad2);
  107. }
  108.  
  109. bool operator < (const Cadena &cad1, const Cadena &cad2) {
  110.   if (strcmp(cad1.c_str(),cad2.c_str()) >= 0)
  111.     return false;
  112.   return true;
  113. }
  114.  
  115. bool operator <= (const Cadena &cad1, const Cadena &cad2) {
  116.   return cad1 < cad2 || cad1 == cad2;
  117. }
  118.  
  119. bool operator > (const Cadena &cad1, const Cadena &cad2) {
  120.   if (strcmp(cad1.c_str(),cad2.c_str()) <= 0)
  121.     return false;
  122.   return true;
  123. }
  124.  
  125. bool operator >= (const Cadena &cad1, const Cadena &cad2) {
  126.   return cad1 > cad2 || cad1 == cad2;
  127. }
  128.  
  129. ostream& operator << (ostream &output, const Cadena &c) {
  130.   output << c.c_str();
  131.   return output;
  132. }
  133.  
  134. istream& operator >> (istream &input, Cadena &c) {
  135.   char* entrada = new char[32];
  136.   entrada[0] = '\0';
  137.   input.width(32);
  138.   input >> entrada;
  139.  
  140.   c = entrada;
  141.   delete[] entrada;
  142.   return input;
  143. }

EDIT:: Vale ya encontre el fallo, retoco el codigo faltaba un +1 en el segundo constructor de la cadena T.T
Mil gracias por ayudarme

Ya que estoy me gustaría preguntar, la función externa mostrar_carro, deberá mostrar o imprimir el contenido del carro de compra de un usuario en
un flujo de salida, mi duda es

¿Un flujo de salida es un tipo de dato ofstream?

Última edición por DvNe; 01/04/2014 a las 11:59
  #10 (permalink)  
Antiguo 01/04/2014, 12:32
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con set

Algo mas que mejorar en el codigo, es que el tipo size_t nunca es negativo, por lo que comparar una variable de tipo size_t ( if( variable < 0 ) ) será siempre falso, o hacer cast antes, para luego comparar if( (size_t) variable < 0 ) tambien sera siempre falso.

Una explicación más profunda del problema a continuacion: (no apto para cardíacos)
El programa que mostrabas generaba un bad_alloc debido a que se intentaba hacer una reserva de memoria tan grande como el numero mas grande que cabe en un entero, esto debido a que el metodo longitud() hace calcula " longitud_ - 1 ", pero esto podria ser negativo cuando longitud_ vale 0 ? La respuesta es no, pues longitud() retorna un size_t (osea, siempre positivo, o cero).

Casi todo el código mostrado antes de presentar la definición de "Cadena" era inocente del problema que se presentaba.
__________________
Visita mi perfil en LinkedIn
  #11 (permalink)  
Antiguo 01/04/2014, 13:27
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con set

Vale entendido perfectamente, gran ojo tienes xD.

Intentare limpiar el código como dices. En cuanto a la duda del ofstream ¿me podrías guíar?
  #12 (permalink)  
Antiguo 01/04/2014, 14:25
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con set

Para que el foro sirva, creo que es mejor que abras un tema aparte.
Quien busque ayuda en algo relacionado con ofstreams probablemente se aleje al ver el titulo de este tema ("Problema con set").
__________________
Visita mi perfil en LinkedIn

Etiquetas: set, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:35.