Ver Mensaje Individual
  #9 (permalink)  
Antiguo 01/04/2014, 11:34
DvNe
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 12 años, 1 mes
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