Fecha y hora actual: Sab 19 May, 2012 21:44 pm
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Problema con una clase con array dinámico (C++)

Responder al Tema

Índice del Foro > C, C#, Visual C++ > Problema con una clase con array dinámico (C++)

Autor Mensaje
Guille87



Registrado: 03 Ene 2012
Mensajes: 4

Mensaje Publicado: Mie 04 Ene, 2012 02:09 am

Título del mensaje: Problema con una clase con array dinámico (C++)

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


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

Mensaje Publicado: Jue 05 Ene, 2012 20:20 pm

Título del mensaje: Re: Problema con una clase con array dinámico (C++)

Responder citando

Es normal, no he visto en el código que muestras ninguna reserva de espacio de memoria un new o similar, el compilador solamente reserva memoria cuando se usa un array o una variable, pero en los punteros la haces tú.


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Guille87



Registrado: 03 Ene 2012
Mensajes: 4

Mensaje Publicado: Lun 09 Ene, 2012 13:57 pm

Título del mensaje: Re: Problema con una clase con array dinámico (C++)

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


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

Mensaje Publicado: Lun 09 Ene, 2012 17:58 pm

Título del mensaje: Re: Problema con una clase con array dinámico (C++)

Responder citando

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
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Guille87



Registrado: 03 Ene 2012
Mensajes: 4

Mensaje Publicado: Sab 14 Ene, 2012 19:39 pm

Título del mensaje: Re: Problema con una clase con array dinámico (C++)

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


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

Mensaje Publicado: Lun 16 Ene, 2012 00:23 am

Título del mensaje: Re: Problema con una clase con array dinámico (C++)

Responder citando

Realmente el problema no era la declaración del método incia(), si no como le estabas pasando el argumento.

Para void TablaVV::inicia(const TablaVar& t) ...
Código:
....
    const TablaVar *TablaVarNoModificable;
   
    TablaVarNoModificable=new TablaVar();
   
    ....inicia(*TablaVarNoModificable);
...
..


Para void TablaVV::inicia(TablaVar* t) ...
Código:
....
    TablaVar *tablaVar;
   
    tablaVar=new TablaVar();
   
    ....inicia(tablaVar);
...
..


De todas formas me alegro que dieras con otra solución...
Risa


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Problema con enlace h, cpp

Faqndo Programación de juegos o videojuegos 1 Vie 18 May, 2012 18:02 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

transferir un array java a javascript

WhiteSkull Java Web 1 Mar 15 May, 2012 20:47 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda problema con proyecto de C. URGE

nlce C, C#, Visual C++ 1 Dom 13 May, 2012 18:28 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Problema con orientacion de disparo.SDL[C++]

Faqndo Programación de juegos o videojuegos 10 Dom 13 May, 2012 12:36 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Clase genérica tecla

robloz Programación de juegos o videojuegos 5 Mar 01 May, 2012 15:26 pm Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,