UTNianos

Versión completa: [Info 2] Problema con herencia
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, tengo 2 clases, una es la clase punto (que es un punto en un eje coordenado) y otra que es figura (que es un circulo que hereda de punto el centro). Estoy con un problema cuando intento implementar el constructor de copia de una figura (refiriendome a figura = circulo siempre)... Pongo el codigo a continuacion y les indico la linea del error abajo.



class punto
{
private:
double c_x,c_y; //POS EN X E Y EN EJE COORDENADO
protected:
static int creados,vivos; //CONTADORES
public:
//CONSTRUCTORES
punto(double = 0, double = 0);
punto(const punto &);
~punto();
//METODOS PARA MANEJO DE DATOS
void Setx(double);
void Sety(double);
double Getx(void);
double Gety(void);

//MANEJO CONTADORES E IMPRIMIR VALORES
static int Getvivos() {return vivos;}
static int Getcreados() {return creados;}
void prt_punto(std::string);

//SOBRECARGAS

punto operator+(const punto&);
punto operator++(int); //postincremento p++;
punto operator++(); //preincremento ++p;
friend std::ostream& operator<<(std::ostream &, const punto&);
};



Ahora la clase figura:



class figura: public punto
{
private:
double radio;
protected:
static int c_c, c_t;
public:
figura(double=0);
figura(double, const punto&);
figura(const figura&);
~figura();

double Getr(){return radio;}
void SetRadio(double r){radio =r;}
};



El problema puntual lo tengo cuando implemento el constructor figura(const figura&);... es el siguiente codigo:



figura::figura(const figura &f):punto()
{
std::cout << "Constructor figura copia: " << this << std::endl;
SetRadio(f.radio);
}


Si lo dejo asi me compila perfectamente, pero notaran que no seteo el eje coordenado (que lo posee f)... cuando hago esto:



figura::figura(const figura &f):punto(f.c_x, f.c_y)
{
std::cout << "Constructor figura copia: " << this << std::endl;
SetRadio(f.radio);
}



Me tira este error:

C:\Clases qt\matias\Practica_parcial-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2008__Qt_SDK__Debug\..\Practica_parcial\figura.cpp:18: error: C2248: 'punto::c_x' : no se puede obtener acceso al miembro private miembro declarado en la clase 'punto'

C:\Clases qt\matias\Practica_parcial-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2008__Qt_SDK__Debug\..\Practica_parcial\figura.cpp:18: error: C2248: 'punto::c_y' : no se puede obtener acceso al miembro private miembro declarado en la clase 'punto'

Ya intente solucionarlo de varias maneras, pero nada, intente en lugar de poner f.c_x con f.Getx() (lo mismo con la y) pero nada. Alguna idea?
Proba con esto:

figura::figura(const figura &f):punto(f)

Usarias el polimorfismo de c++ passandole aal constructor de copia de punto un objeto que es como punto.
Si no anda con eso, despues lo veo bien.
ahi compila y lo hace bien... hice lo que dijiste =P graciaas! igual tengo una duda.... Porque funciona asiii? jajaja, onda... no es que el constructor punto espera un objeto punto? yo ahi le estoy pasando f que es un objeto figura.... (o cuando paso asi lo que hace es pasar f con los datos de punto y no de figura?).
Pasa que Andres uso el poliformismo que no esta dentro del alcance de info 2.
ah ah ah ah..... sisi, hubo un ligero comentario sobre polimorfismo en el curso.... pero no mas que eso, sin hacerlo con polimorfismo no se puede?
Capaz la estoy flasheando porque lo vi por arriba pero te convendria en el getx, gety usar la llamada por referencia, despues hacer un constructor parametrizado usando esas llamadas por referencia por ejemplo.
mmmm.... no entendi una pomo a que te referis Elmats jajaja xD
Figura(double z=0, double x=0, double y=0)
{
r=z;
punto::GetValor(x,y);
b=x;
h=y;

};


pero GetValor la defino asi:
Hago el llamado por referencia para poder llamarla y obtener las cosas desde fuera de la clase.


void Rectangulo::GetValor(double &x, double &y)
{
x = x_;
y = y_;
}
Claro, pasa que la idea era hacer el constructor por referencia (pasarle un objeto figura y que lo cree en base a eso) y no pasarle dato por dato =P, porque ese ya lo tengo hecho
URLs de referencia