Foros del Web » Programación para mayores de 30 ;) » C/C++ »

contructor de copias

Estas en el tema de contructor de copias en el foro de C/C++ en Foros del Web. Hola a todos,tengo un problema y es que estoy haciendo un juego de damas y tengo una clase Tablero que tiene un atributo que es ...
  #1 (permalink)  
Antiguo 24/04/2007, 03:17
 
Fecha de Ingreso: junio-2004
Ubicación: ORENSE
Mensajes: 258
Antigüedad: 19 años, 10 meses
Puntos: 0
contructor de copias

Hola a todos,tengo un problema y es que estoy haciendo un juego de damas y tengo una clase Tablero que tiene un atributo que es panel que es un array [8][8] de otra clase Casilla.Esta clase Casilla me va a tener un puntero a una clase Dama si tiene una Dama y sino a NULL.
El problema es que no se como hacer un constructor de copias porque al haber punteros por medio no quiero que la copia me apunte a los mismos valores porque si modifico algo en la copia quiero que el original no se me modifique.Que tengo que hacer para poder hacer esto??
__________________
Inmuebles de Galicia:www.inmueblevirtual.net
Compartir piso en Galicia:www.inmueblevirtual.net/foro
  #2 (permalink)  
Antiguo 25/04/2007, 22:04
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: contructor de copias

Se me ocurre que dentro de tu clase tengas un metodo llamado clone. Que copie el objeto a otro totalmente diferente, pero con los mismos datos.

Solo una sugerencia.

Saludos
  #3 (permalink)  
Antiguo 26/04/2007, 03:32
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años
Puntos: 0
Re: contructor de copias

¿ya leíste la sección 10.4.4.1 Copying Objects del libro The C++ Programming Language, 3rd. Ed.? En el menciona cómo tratar los casos cuando tienes una clase cuyos miembros son apuntadores. (Lo que sigue es una traducción libre de un extracto de esa sección.) Básicamente tienes que definir dos funciones: una que trate el caso de cuando creas un objeto de la clase y al mismo tiempo la inicializas con otro objeto de la misma clase, y otra de cuando tienes ya dos objetos de la clase, y le asignas uno de ellos al otro. O sea, si Table es una clase, en la siguiente función tendrías problemas:
Código:
void h ()
{
   Table t1;
   Table t2 = t1 ; // inicialización por copia: problema
   Table t3;
   t3 = t2; // copia por asignación: problema
}
Si no declaras funciones para manejar esos casos, el compilador manejará por defecto estas copias copiando miembro a miembro las clases.
Si solicitas memoria dinámica al construir un objeto de la clase y después la liberas con el destructor, entonces se llamará al constructor dos veces, una para t1 y otra para t3. Para t2 no se llama, ya que fue inicializado por copia. Sin embargo, el destructor es llamado tres veces: para t1, t2 y t3. Dado que la asignación por defecto se hace miembro a miembro, los tres objetos tendrán un apuntador hacia la memoria solicitada al comienzo por t1. La memoria solicitada por t3 estará sin referenciar, ya que su apuntador se modificó con la asignación t2=t3. Así, en la ausencia de un recolector automático de basura, esta memoria se perderá para siempre. Por otro lado, la memoria solicitada por t1 aparece referenciada tres veces, de manera se borrará otras tantas veces. El resultado es indefinido y probablemente desastroso.
Tales anomalías se corrigen definiendo dos funciones, cada una de las cuales trata los dos casos anteriores:
Código:
class Table {
   // ...
   Table (const Table&); // constructor de copia
   Table& operator= (const Table&); // copia por asignación
};
El programador puede definir cualquier significado apropiado para estas operaciones, pero el tradicional para esta clase de contenedores es copiar los elementos del contenedor (o al menos dar al usuario del contenedor la apariencia de que una copia se ha hecho). Por Ejemplo:
Código:
Table::Table (const Table&t) // constructor de copia
{
   p = new Name[sz=t.sz];
   for (int i=0; i<sz; i++) p[i] = t.p[i];
}
Table& Table::operator=(const Table&t) // asignación
{
   if (this!= &t) { // cuidado de la auto-asignación
      t = t
      delete []p;
      p = new Name[sz=t.sz];
      for (int i=0 ; i<sz ; i++) p[i] = t.p[i];
   }
   return *this;
}
Como casi siempre es el caso, el constructor por copia y la copia por asignación difieren considerablemente. La razón fundamental es que el constructor por copia inicializa memoria no inicializada, mientras que el operador de la copia por asignación debe de tratar con un objeto ya construído.
La asignación puede optimizarse en algunos casos, pero la estrategia general para un operador de asignación es simple: protegerse contra auto-asignaciones, borrar elementos antiguos, inicializar y copiar en nuevos elementos. Usualmente cada miembro no estático debe copiarse.
  #4 (permalink)  
Antiguo 26/04/2007, 03:35
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años
Puntos: 0
Re: contructor de copias

Perdón, se me olvidó mencionar que el autor del libro es el mismo creador del lenguaje C++, Bjarne Stroustrup.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:15.