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

Copia de un objeto derivado con poliformismo

Estas en el tema de Copia de un objeto derivado con poliformismo en el foro de C/C++ en Foros del Web. Hola tengo esta clase: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #ifndef LIGAPJ_HPP #define LIGAPJ_HPP #include <iostream> #include <vector> #include <string.h> using namespace std ;   ...
  #1 (permalink)  
Antiguo 09/02/2014, 14:35
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 3 meses
Puntos: 29
Copia de un objeto derivado con poliformismo

Hola tengo esta clase:

Código C++:
Ver original
  1. #ifndef LIGAPJ_HPP
  2. #define LIGAPJ_HPP
  3. #include <iostream>
  4. #include <vector>
  5. #include <string.h>
  6. using namespace std;
  7.  
  8. class lpj{
  9. public:
  10.     lpj(){};
  11.     virtual ~lpj();
  12.     virtual string getName()=0;
  13.     virtual vector<string>getEnchants()=0;
  14. };
  15. #endif


De ella derivan objetos como estos:

Código C++:
Ver original
  1. #ifndef ASHE_HPP
  2. #define ASHE_HPP
  3. #include "ligaPj.hpp"
  4.  
  5. class ashe:public lpj{
  6. public:
  7.     static const string type;
  8.  
  9.     ashe(const string);
  10.     ashe(const ashe &);
  11.     virtual ~ashe(){}
  12.     virtual string getName(){return name;}
  13.     virtual vector<string>getEnchants();
  14.  
  15.  
  16. private:
  17.     const string name;
  18.     static const vector<const string>enchants;
  19.  
  20. };
  21.  
  22. #endif

Luego tengo esta función miembro de otra clase diferente que no es importante

Código C++:
Ver original
  1. //Definicion de pj
  2. lpj *pj; //Es un miembro de una clase y es private
  3. void user::choosePj(lpj &p){
  4.     pj=&p;
  5. }

Esta funcion recibe una referencia a una clase derivada de la clase "lpj" pero el problema es que si se destruye la dirección de memoria donde apunta la referencia también se perdira en la clase que contiene choosePJ();

He pensado con el operador new pero no se puede ya que tengo que crear de nuevo el objeto y no conosco la clase que se pasa por parametro solo que deriva de lpj.

Ayuden me pls
  #2 (permalink)  
Antiguo 10/02/2014, 04:55
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Copia de un objeto derivado con poliformismo

"...el problema es que si se destruye la dirección de memoria donde apunta la referencia también se perdira en la clase que contiene choosePJ()..."

Cierto, pero dado que el miembro privado de la clase user 'lpj *pj' es un puntero a un objeto lpj y que desde la funcion choosePj no puedes crear el lpj por falta de datos, solo te quedan tres opciones: o bien modificas todo para que la funcion choosePj sea capaz por si sola de crear el lpj, o bien implementas una notificacion a 'user' para cuando se elimine el objeto *pj (que asigne nulo y sepa que ya no existe o no es valido). La tercera opcion es implementar una funcion en lpj para que se clone a si mismo, retornando una nueva instancia independiente del objeto que la genera. Con un new o con una desreferencia no se si se soluciona el problema (creo que no), pero por probar que no quede:

Código C++:
Ver original
  1. //con new
  2. lpj *clon = new lpj(pj);
  3.  
  4. // con una desreferencia:
  5. lpj clon = *pj;

Para la forma de clonar desde la propia clase no te pongo nada de codigo para no equivocarme. La cosa va por ahi, seguramente alguien con conocimiento de c++ sabra aportarte una mejor solucion.

Saludos
vosk
  #3 (permalink)  
Antiguo 10/02/2014, 14:39
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 3 meses
Puntos: 29
Respuesta: Copia de un objeto derivado con poliformismo

Cita:
Iniciado por vosk Ver Mensaje
"...el problema es que si se destruye la dirección de memoria donde apunta la referencia también se perdira en la clase que contiene choosePJ()..."

Cierto, pero dado que el miembro privado de la clase user 'lpj *pj' es un puntero a un objeto lpj y que desde la funcion choosePj no puedes crear el lpj por falta de datos, solo te quedan tres opciones: o bien modificas todo para que la funcion choosePj sea capaz por si sola de crear el lpj, o bien implementas una notificacion a 'user' para cuando se elimine el objeto *pj (que asigne nulo y sepa que ya no existe o no es valido). La tercera opcion es implementar una funcion en lpj para que se clone a si mismo, retornando una nueva instancia independiente del objeto que la genera. Con un new o con una desreferencia no se si se soluciona el problema (creo que no), pero por probar que no quede:

Código C++:
Ver original
  1. //con new
  2. lpj *clon = new lpj(pj);
  3.  
  4. // con una desreferencia:
  5. lpj clon = *pj;

Para la forma de clonar desde la propia clase no te pongo nada de codigo para no equivocarme. La cosa va por ahi, seguramente alguien con conocimiento de c++ sabra aportarte una mejor solucion.

Saludos
vosk
Hola no tengo problema en crear una función de copia de la clase lpj pero no creo que funcionaria con los objetos derivados o tendré que crear para cada objeto su constructor de copia lo que no me gusta mucho.
Luego la segunda opción de mandar le una notificación al usuario que utiliza las clases tampoco me parece la mas adecuada ya que no resuelve el problema.

Luego de modificar todo no tengo problema en hacerlo pero no se me ocurre como hacer lo ya que quiero que la función choosePj se pueda llamar en cualquier momento para poder cambiar el pj.

Gracias de todos modos
Saludos

Etiquetas: copia, funcion, objeto, string
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 12:22.