FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Como puedo asignar una copia de una instancia sin que sea una referencia.
Hola amigos, una vez más requiero de su gran ayuda.
Tengo una clase definida de esta manera: Código:
Individuo=class(TObject) private protected public VClasificacion:VectorIR; VCoordenadas:VectorIR; Inercia:Double; VDistancias:VectorIR; TieneClasesVacias:Boolean; procedure CargarClasificacionYDistancias(); procedure GenerarVecino(CantiParticion:Integer); procedure CGRealesParaClasificacion(); function RecalcularInercia:Double; published //destructor Destroy; override; end; Código:
Var2:=Var1; Var1.Destroy; Mi pregunta es: ¿existe una forma de realizar la asignación de modo que se me guarde una copia y no una referencia al mismo espacio de memoria? Con el fin de modificar luego una de las variables manteniendose la otra intacta. Gracias de antemano por su valiosa ayuda. |
#2
|
||||
|
||||
Escribe un procedimiento Assign que asigne todas las propiedades de tu clase.
TPersistent tiene ese método virtual, así que puedes derivar de TPersistenty completar tu Assign con las nuevas propiedades de tu clase. Por supuesto puedes realizar tu método de asignación desde cero. Cuando se realizan asignaciones de este tipo se debe tener cuidado al asignar punteros y en este sentido todos los objetos VCL lo son, así que tendrás que asignar contenidos. Por eso lo mejor es usar el Assign de las clases VCL y completar la asignación de lo propio de nuestra clase. Saludos. |
#3
|
|||
|
|||
Muchas gracias. Cambie TObject por TPersistent y coloqué un nuevo procedimiento
Código:
procedure Individuo.Assign(IndiEnviado:Individuo); begin VCoordenadas:= IndiEnviado.VCoordenadas; VClasificacion:=IndiEnviado.VClasificacion; VDistancias:=IndiEnviado.VDistancias; Inercia:=IndiEnviado.Inercia; TieneClasesVacias:=IndiEnviado.TieneClasesVacias; end; Gracias por su aporte y su valioso tiempo. |
#4
|
||||
|
||||
Hola TecnoBestia.
Me alegra que hayas solucionado el problema, pero creo que el amigo escafandra se refería a algo parecido a esto:
Un saludo.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#5
|
||||
|
||||
Exacto, se trata de sobreescribir el método Assign para añadir en él las asignaciones de las propiedades propias de nuestra nueva clase, tal como muestra ecfisa en su código.
TecnoBestia, se trata de sobrecargar la función virtual para terminar llamando a la heredada, en otro caso te pierdes las propiedades de la clase madre. Saludos. |
#6
|
||||
|
||||
¿Y Vale la pena heredar desde TComponent sólo por un método? Antes a cambios en la estructura jerárquicas de nuestras clases es mejor pensarlo dos veces.
¿Te aporta alguna otra ventaja que sea de la clase TComponent? ¿necesitarás hacer streaming para recuperar datos? ¿En que te afecta, o que tan complicado es directamente añadirle un método CopiarA() que haga un trabajo similar? Digo... siendo honestos es lo mismo que harías con el Assing:
Con todo repeto, me parece un desperdicio heredar de TComponent si en verdad la clase no se va a comportar como un componente. Saludos, |
#7
|
||||
|
||||
Muy puntual lo dicho por ecfisa y escafandra.
Solamente una observación: Cita:
Saludos. Al González. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como Puedo Asignar un TObjetList a un CxBdlookupCombobox Sin Recorrer La Lista | joelphi | Conexión con bases de datos | 1 | 14-02-2009 02:44:29 |
¿Cómo puedo saber el tamaño que debo asignar al buffer? | MON___ | API de Windows | 5 | 02-02-2008 22:08:02 |
Como puedo librarme de la referencia circular? | Lionheart | OOP | 2 | 13-12-2005 13:58:33 |
Como puedo asignar un ip a un equipo | yayita | Internet | 3 | 12-03-2004 22:09:52 |
Como puedo saber si un una variable instancia se le a realiso un create | orfeo | OOP | 1 | 05-05-2003 08:42:38 |
|