Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/05/2013, 03:35
Avatar de Doommarine_Maxi
Doommarine_Maxi
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 8
[Sobrecarga de operadores] Explicación de sobre código

¡Hola a todos!, soy yo de vuelta y vuelvo a quitarles un poco de tiempo para pedirles ayuda con un código que he escrito para practicar sobrecarga de operadores.

Como casi todos los que recién inician en el manejo serio de clases, mi primer clase es de una cadena, si, poco original.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. using namespace std;
  7.  
  8. /*Clase Cadena*/
  9.  
  10. class Cadena
  11. {
  12.     public:
  13.         Cadena(); /*Constructor default*/
  14.         Cadena(const char*); /*Sobrecarga de constructor con parametro puntero a char (array) constante*/
  15.         Cadena &operator=(const Cadena&); /*Sobrecarga de Operador = con parametro Cadena mediante referencia y constante*/
  16.         Cadena &operator=(const char*); /*Sobrecarga de Operador = con parametro puntero a char (array) constante*/
  17.         Cadena operator+(const Cadena&); /*Sobrecarga de Operador + con parametro Cadena mediante referencia y constante*/
  18.         Cadena operator+(const char*); /*Sobrecarga de Operador + con parametro puntero a char (array) constante*/
  19.         //~Cadena() { delete [] cad; }; //Este destructor me generaba problemas en ejecución
  20.         void Mostrar() { cout << cad << endl; }
  21.     private:
  22.         char* cad; /*Puntero a cadena que va a funcionar como un array*/
  23. };
  24.  
  25. Cadena::Cadena()
  26. {
  27.     /*En caso default de declaración de cadena el valor de cad es nulo*/
  28.     cad = NULL;
  29. }
  30. Cadena::Cadena(const char* cadena)
  31. {
  32.     /*Asigno el valor de cadena a cad*/
  33.     this->cad = new char[strlen(cadena)+1]; /*Reservo a un espacio de la memoria equivalente a la cantidad de
  34.     caracteres en la cadena parametro más 1 para el caracter nulo que marca el final de cadena*/
  35.     strcpy(this->cad, cadena);
  36. }
  37.  
  38. /*La función sobrecarga de operator= en tipo de dato Cadena devuelve la dirección de la memoria
  39. del valor que da como retorno esta función*/
  40. Cadena &Cadena::operator=(const Cadena &CadC)
  41. {
  42.     if (this == &CadC)
  43.         return *this;
  44.     if (!CadC.cad)
  45.         return *this;
  46.  
  47.     delete [] this->cad;
  48.     this->cad = new char[strlen(CadC.cad)+1];
  49.     strcpy(this->cad, CadC.cad);
  50.     return *this; /*Devulevo el valor de la cadena actual a la que le asigne el "cad" de CadC
  51.     , este valor luego, debido a &Cadena::..., pasa en realidad la dirección de memoria de *this, que es this*/
  52. }
  53.  
  54. Cadena &Cadena::operator=(const char* C)
  55. {
  56.     if (!C)
  57.         return *this;
  58.  
  59.     delete [] this->cad;
  60.     this->cad = new char[strlen(C)+1];
  61.     strcpy(this->cad, C);
  62.     return *this;
  63. }
  64.  
  65. /*En estas funciones, la sobrecarga del operador+ esta el problema del desbordamiento al usar
  66. la propiedad del destructor de cadena para liberar la memoria reservada por "cad"*/
  67. Cadena Cadena::operator+(const Cadena &CadC)
  68. {
  69.     if (!CadC.cad)
  70.         return *this;
  71.     Cadena temp;   
  72.     temp.cad = new char[strlen(CadC.cad)+strlen(this->cad)+1];
  73.     strcpy(temp.cad, this->cad);
  74.     strcat(temp.cad, CadC.cad);
  75.  
  76.     return temp;
  77. }
  78. Cadena Cadena::operator+(const char *C)
  79. {
  80.     if (!C)
  81.         return *this;
  82.  
  83.     Cadena temp;   
  84.     temp.cad = new char[strlen(C)+strlen(this->cad)+1];
  85.     strcpy(temp.cad, this->cad);
  86.     strcat(temp.cad, C);
  87.  
  88.     return temp;
  89. }
  90.  
  91. int main()
  92. {
  93.     Cadena H("Hola mundo");
  94.     Cadena *J;
  95.     Cadena *K;
  96.     K = &H;
  97.            
  98.     J = new Cadena[3];
  99.     J[0] = "Hola ";
  100.     J[1] = "mis ";
  101.     J[2] = "Amigos.";
  102.    
  103.     for (int x=0; x < 3; x++) J[x].Mostrar();
  104.  
  105.     H.Mostrar();
  106.     H = "Hola a todos";
  107.     H.Mostrar();
  108.     H = H + (H + " Chau");
  109.     H.Mostrar();
  110.  
  111.     *K = J[0] + J[1] + J[2];
  112.     H.Mostrar();
  113.  
  114.     delete [] J;
  115.    
  116.     return 0;
  117. }

Me gustaría que me puedan ayudar a saber cual es el error que cometo en la sobrecarga del operador+ en tipo de clase Cadena, que tal es el problema que si activo el destructor se genera un error durante la ejecución.

Muchas gracias, también me gustaría, y esto es opcional y se los agradecería mucho, si me pudieran decir si esta bien comentado mi código, o si estoy cometiendo algún error al interpretar las referencias o los punteros.