Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

destruccion de una clase

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: destruccion de una clase Responder citando

Hola, en mi programa tengo definida una clase el ".h"
class icono
{
public:
int X, Y;
TImage* Image;
TLabel* Label;
}
en el cpp tengo...

tengo un std:vector de "icono"´s

el tema es que deseo crear un botón de elminar "icono" y que me lo elimine del vector, pero... es suficiente borrar del vector?, luego tengo que eliminar el Image y el Label de la pantalla?
Como puedo hacer para que me elimine de un plumazo todo? por que claro si no elimino el Image con "delete Image..." no me lo borra de la pantalla. Tengo que declarar la clase de otro modo?

Gracias por las respuestas
Volver arriba
Mensaje    Asunto: Responder citando

holas creo que para que tu clase pueda destruirse depende de como la inicialices si utilizas un puntero a la clase debera ser inicializada con New y para ser eliminada se utilizara con delete.
Asi mismo depende de que atributos tenga tu clase si existen punteros u otros tipos de datos en el Constructor de la clase debe estar la inicializacion de la misma, para que al destruirla se llame al destructor de la clase en donde debes liberar los puntero que utiliza la clase
en el h
Código:
class cadena
{
  Private
    char *datos;
    int nro;
  public:
    cadena(int); // constructor
    ~cadena(); // destructor
};

y en el cpp
Código:
//constructor
cadena::cadena(int longitud)
{
  datos=new char[longitud];
  nro = longitud
}
 
//destructor
cadena::~cadena()
{
  delete datos;
}

como ven la clase se encarga de gestionar el puntero que crea en su constructor ya que en el destructor se encarga de eliminarlo de memoria, Espero haberme echo entender.
Américo
C++ Builder lo Mejor de lo mejor
Volver arriba
Mensaje    Asunto: Responder citando

solo para decir que el invitado era yo y que pueden encontrar informacion de programacion orientada a objetos en esta pagina
http://programarenc.webcindario.com/Cplus/cplusplus.htm
Américo
C++ Builder lo mejor de lo mejor
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Lo tengo asi Responder citando

en el .h
class Tico
{
public:
int ID;
String name;
TImage *Image;
TLabel *Label;
};

en la cabecera de .cpp
Tico * icono; // icono es ce clase Tico
std::vector<Tico *> icos(2000); // creamos un vector de icos
...
y despues en el programa...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Tico* icono = new Tico;
icos[n]= icono; //icos[n] es un icono (clase Tico)
icos[n]->ID=n;
icos[n]->Image=new TImage(this);
icos[n]->Label=new TLabel(this);
icos[n]->posX=12;
icos[n]->Image->Left=3;
icos[n]->Image->Parent=Form1->ScrollBox1;
icos[n]->Label->Parent=Form1->ScrollBox1;
icos[n]->Image->Tag=n;
icos[n]->Image->Top=10;
icos[n]->Image->Left=10;
icos[n]->Image->AutoSize=true;
icos[n]->Image->Picture=Image1->Picture;
icos[n]->Image->BringToFront();
icos[n]->Image->OnMouseDown=ImgDown;
icos[n]->Image->OnMouseMove=ImgMove;
icos[n]->Image->OnMouseUp=ImgUp;
icos[n]->Image->OnClick=ImgClick;
icos[n]->Label->Top=icono->Image->Top+Image1->Height;
icos[n]->Label->Left=icono->Image->Left;
icos[n]->Label->Caption="icono "+IntToStr(icono->Image->Tag);
icos[n]->Label->Transparent=true;
icos[n]->Label->Visible=true;

n++;
}
ya asi me voy creando los objetos de la clase Tico
para destruirlo intento:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
icos.erase(icos.begin() + id);
}
pero claro, la imagen del ico no desaparece de la pantalla, y por eso deberia de hacer un delete icos[id] que no funciona claro

espero haberme explicado bien
Gracias
Volver arriba
Mensaje    Asunto: Responder citando

Bien, dada la explicacion, utilizando std::vector, esto puede quedar asi..
para destruir la imagen, que no necesitas, no existe, una funcion "delete" y pasarle un parametro para borrarlo como si fuera un indice.

pero existe, una funcion, para intercambiar la imagen, con otra, y pasarle los elementos del vector, que estan, y una opcion seria enviar el elmento a borrar al final del vector, y luego utilizar, la funcion pop_back, ya que se supone que grabas con push_back, y posteriormente, redimensionar al vector


Código:

#include <vcl.h>
#include <vector>


//funcion de la clase.
void TFotos::deleteFoto(int Index){
    int recorrer;
// recorremos el vector e intercambiamos los elementos
//
    for(recorrer=Index;recorrer!=(int) this->Fotos.size()-1;recorrer++){
            std::swap(this->Fotos[recorrer],this->Fotos[recorrer+1]);
        }
// y borramos el ultimo,
      this->Fotos.pop_back();
   
}


y una forma de usar la funcion, previa clase

Código:
TFoto *pfot = new TFoto();
pfot ->    pFot->deleteFoto(4); // borramos el boton o foto 4

_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Jue 21 Oct, 2004 11:17 pm, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

por si no ven la respuesta, je je
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola, estoy empezando a manejar vectores, por eso me interesó este hilo.

Lo que ocurre es que me da la sensación de que Juan e Isabel hacen lo correcto, aprovechar los métodos de std::vector para borrar un elemento determinado sin abusar de código.

El problema no me parece que esté en el borrado del elemento sino en su presencia en pantalla ¿es eso? ¿habéis comprobado si el vector tiene un elemento menos después de su borrado? (con el debugger o un simple mensaje mostrando icos.Count).

Lo que ocurre es que borrar un elemento de la memoria no equivale a refrescar la pantalla, seguramente tendréis que actualizar el índice del elemento a mostrar en pantalla y posteriormente pedir que lo muestre ¿me equivoco?

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

lo he probado haciendo un vector de botones, uno de imagene, uno de paneles, y siempre, se redimenziona automaticamten, el vector, el codigo es para borrar el elemento del vector, el control del mismo corresponde a los usuarios finales,
je
saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.