|
| Autor |
Mensaje |
Guille87
Registrado: 03 Ene 2012 Mensajes: 4
|
Publicado: Mie 04 Ene, 2012 02:09 am
Título del mensaje: Problema con una clase con array dinámico (C++) |
|
|
Buenas. Tengo un problema con una práctica para la universidad, a ver si alguien me puede echar una mano. La práctica la hicimos con arrays estáticos y no tuve ningún problema, pero ahora tenemos que modificarla y pasar todo a punteros, y es cuando he empezado a liarme bastante. Nos han dicho que para facilitar las cosas vayamos pasando a punteros clase por clase, de una en una, y vayamos viendo si sigue funcionando correctamente (y no va dejando "basura").
Las clases que me dan el problema son estas dos: TablaVar y TablaVV. La primera ya la he pasado a punteros y consiste en un array dinámico de caracteres, mientras que la segunda todavía es un array estático de registros con un caracter y un valor entero. Aqui las declaraciones de ambas:
const MAX_VAR = 200;
class TablaVar {
private:
char* tablaVar;
int numVar;
int max_var;
public:
TablaVar();
~TablaVar();
void inicia();
void limpia();
int dameNumVar()const;
char dameElem(int i)const;
void insertar(const char& b);
};
class TablaVV {
private:
typedef struct {
char var;
int valor;
} VV;
VV tablaVV[MAX_VAR];
int numE;
public:
TablaVV();
~TablaVV();
void inicia();
void limpia();
void inicia(const TablaVar& t);
bool actualizar(int i, int v);
int dameNumE();
char dameVar(int i);
int dameValor(int i);
};
El problema es con el método que está en negrita, que inicia la TablaVV a partir de la TablaVar y pone los valores a 0. Pongo el código a continuación:
void TablaVV::inicia(const TablaVar& t){
for (int i=0;i<t.dameNumVar();i++){
tablaVV[i].valor=0;
tablaVV[i].var=t.dameElem(i);
numE++;
}
}
Al acabar este método, no se por qué, pero llama automaticamente a la destructora de TablaVar, cuando creo que no debería hacerlo:
TablaVar::~TablaVar() {
delete[] tablaVar;
tablaVar = NULL;
};
El problema viene cuando después de esto, sigo queriendo utilizar la TablaVar, pero evidentemente, al estar ya destruida, me salta un mensaje de error. Mi pregunta es por qué me salta la destructora de TablaVar y como puedo evitarlo.
Un saludo. |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
Guille87
Registrado: 03 Ene 2012 Mensajes: 4
|
Publicado: Lun 09 Ene, 2012 13:57 pm
Título del mensaje: Re: Problema con una clase con array dinámico (C++) |
|
|
Bueno el código es bastante grande y no lo he puesto entero. La constructora de las clases me las he saltado. La de TablaVar, que es el array dinámico, es la siguiente:
TablaVar::TablaVar() {
numVar=0;
max_var = MAX_VAR;
tablaVar = new char[max_var];
};
de todas formas como ya he dicho, el array se crea bien, el problema es que se destruye antes de tiempo.
Gracias aun así, un saludo! |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Lun 09 Ene, 2012 17:58 pm
Título del mensaje: Re: Problema con una clase con array dinámico (C++) |
|
|
| Guille87 escribió: | | Código: | void TablaVV::inicia(const TablaVar& t){
for (int i=0;i<t.dameNumVar();i++){
tablaVV[i].valor=0;
tablaVV[i].var=t.dameElem(i);
numE++;
}
}
|
Al acabar este método, no se por qué, pero llama automaticamente a la destructora de TablaVar, cuando creo que no debería hacerlo |
No, no debería. Porque solamente toma la referencia de un objeto, no está creado en el ámbito del método.
Lo que si deberías hacer, para despejar algunas dudas, es comprobar los valores que devuelven las funciones que llamas dentro de ese método. dameNumVar() y dameElem(), hazlo sencillamente con una depuración manual mediante funciones de salida por pantalla como un printf() o un cout. Y por último cerciórate de que el objeto que le pasas como argumento, está creado. También te aconsejo que reemplaces el const MAX_VAR 200 por un #define MAX_VAR 200, hazlo y me cuentas. |
http://www.youtube.com/watch?v=-lT1zCukNQY
|
|
| Volver arriba |
|
|
Guille87
Registrado: 03 Ene 2012 Mensajes: 4
|
Publicado: Sab 14 Ene, 2012 19:39 pm
Título del mensaje: Re: Problema con una clase con array dinámico (C++) |
|
|
Problema resuelto. Al final seguí pasando todo a punteros como decía el enunciado de la práctica y el problema se me resolvió prácticamente solo, en vez de void TablaVV::inicia(const TablaVar& t), con
void TablaVV::inicia(TablaVar* t) ya no da ningún problema.
Gracias de todas formas! |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|