Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/08/2012, 18:11
Avatar de Doommarine_Maxi
Doommarine_Maxi
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 8
Desbordamiento en una clase [realloc]

Bueno, estoy teniendo un problema con una clase, se llama "Servicios"
Dentro de otra clase llamada empresa cuando la quiero editar, agregarle parametros, se desborda.
Pero si la creo afuera de la clase no pasa lo mismo, funciona correctamente.


clases.cpp
Código C++:
Ver original
  1. /*La clase Factura no la agrego por que no es la causante del problema*/
  2. class Compania
  3. {
  4.     private:
  5.         char* nombre;
  6.     public:
  7.         char* getName(){ return nombre; }
  8.         void setName(char* n){ nombre = n; return; }
  9. };
  10. class Servicio
  11. {
  12.     private:
  13.         char* nombre;
  14.         int m_max;
  15.         Compania *comp;
  16.     public:
  17.         Servicio();
  18.         char* getName(){ return nombre; }
  19.         void setName(char* p){ nombre = p; return; }
  20.         void Agregar(Compania);
  21. };
  22. Servicio::Servicio()
  23. {
  24.     m_max = 0;
  25.     comp = (Compania*)calloc(1, sizeof(Compania));
  26. }
  27. void Servicio::Agregar(Compania Cp)
  28. {
  29.     m_max++;
  30.     comp = (Compania*)realloc(comp, sizeof(Compania)*(m_max+1));  /* EL desbordamiento
  31.  se genera aquí dentro de la clase empresa*/
  32.     comp[m_max] = Cp;
  33.     return;
  34. }
  35. class Empresa
  36. {
  37.     private:
  38.         int f_max;
  39.         int c_max;
  40.         int s_max;
  41.     public:
  42.         Factura *facturas;
  43.         Compania *companias;
  44.         Servicio *servicios;
  45.         Empresa();
  46.         void AgregarFactura(char*, float);
  47.         void AgregarServicio(char*);
  48.         void AgregarEmpresa(char*);
  49. };
  50.  
  51. void Empresa::AgregarFactura(char* ser, float mont)
  52. {
  53.     f_max++;
  54.     facturas = (Factura*)realloc(facturas, sizeof(Factura)*(f_max+1));
  55.     facturas[f_max].setMonto(mont);
  56.     facturas[f_max].setNombre(ser);
  57. }
  58. void Empresa::AgregarServicio(char* ser)
  59. {
  60.     s_max++;
  61.     servicios = (Servicio*)realloc(servicios, sizeof(Servicio)*(s_max+1));
  62.     servicios[s_max].setName(ser);
  63.     return;
  64. }
  65. void Empresa::AgregarEmpresa(char* emp)
  66. {
  67.     c_max++;
  68.     companias = (Compania*)realloc(companias, sizeof(Compania)*(c_max+1));
  69.     companias[c_max].setName(emp);
  70.     return;
  71. }
  72. Empresa::Empresa()
  73. {
  74.     f_max = 0;
  75.     c_max = 0;
  76.     s_max = 0;
  77.     facturas = (Factura*)calloc(1, sizeof(Factura));
  78.     companias = (Compania*)calloc(1, sizeof(Compania));
  79.     servicios = (Servicio*)calloc(1, sizeof(Servicio));
  80. }

main.cpp
Código C++:
Ver original
  1. ....
  2.     Empresa em;
  3.     em.AgregarServicio(ConstToCad("Luz"));
  4.     em.AgregarServicio(ConstToCad("Internet"));
  5.     em.AgregarServicio(ConstToCad("Gas"));
  6.  
  7.     em.AgregarEmpresa(ConstToCad("Edesur"));
  8.     em.AgregarEmpresa(ConstToCad("Metrogas"));
  9.     Compania p;
  10.     p.setName(ConstToCad("Edenor"));
  11.     em.servicios[1].Agregar(em.companias[1]); //Desbordamiento aquí
  12.     em.servicios[1].Agregar(p); //Desbordamiento aquí
  13.     Servicio f;
  14.     f.Agregar(em.companias[1]); //Esto funciona bien
  15.     f.Agregar(p); //Esto funciona bien
  16.         ...

Por lo lo que veo el desbordamiento se genera en la clase empresa, pero no se por que, solamente tengo hipótesis.

Gracias por su atención.