Programación General > Visual C++

 Clases abstractas

(1/2) > >>

rgpsolocodigo:
Tengo la clase LD que contiene a otra LN, a su vez LN puede ser de diferentes clases, por lo que estoy intentando utilizar clases abtractas, defino a LN como clase abstracta y a otras (por ejemplo XCBR) como clases concretas. este es el programita:


--- Citar ---class LN
{
public:
char LNName[10];
char LNRef[30];
char Data[100];
struct {float ctVal,stVal,q,t;} Pos;
LN(){};
~LN(){};
};

class XCBR : public LN
{
public:
int b;
XCBR(){};
~XCBR(){};
};

class LD
{
public:
char LDName[30];
char LDRef[30];
char LogicalNode[100];
LN *LN;

LD()
{
LN = new XCBR;
}
;
~LD(){};
};

void main()
{
LD LD;
LD.LN->b;
}
--- Fin de la cita ---


O sea que el objeto LN del main es de la clase abstracta LN y clase concreta XCBR (no se si se dice de esta manera). El tema es que el atributo b esta declarado en la clase XCBR y desde el main me dice que la clase LN no tiene un atributo b, lo cual es correcto, pero en realidad no hace lo que yo quiero hacer con clases abstractas que es que el objeto contenga los atributos de la clase LN y XCBR.


Pido ayuda

gracias

Eternal Idol:
La clase LN no tiene ningun miembro llamado b ... y tu variable LN es un puntero de esa clase.


--- Código: Text ---((XCBR*)(LD.LN))->b; 

rgpsolocodigo:
No entiendo la linea de codigo que me pasaste.

Yo creia que al hacer:

LN *LN;
LN = new XCBR;

entonces ahora el objeto LN tenia tambien los atributos de XCBR, veo que esto no es asi, quizas le erre de tema y no se hace con clases abstractas. El tema es que tengo muchos tipos de LN y algun metodo para hacer esto me simplificaria todo

Eternal Idol:
Es correcto, el objeto es de la clase XCBR pero la variable sigue referenciando un tipo LN, por eso es que haciendo un casting tal como te mostre es capaz de acceder al atributo de b sin problemas, el objeto es el mismo.

Este es tu codigo:
LD.LN->b;

En ambos casos LD.LN es un puntero a una clase (LN), la unica diferencia con el siguiente codigo es que hacemos un casting a XCBR:
((XCBR*)(LD.LN))->b;

Tal vez asi lo veas mas claro:
XCBR *temp = (XCBR*)LD.LN;
temp->b;

rgpsolocodigo:
MM creo no ser claro, este seria el codigo :

#include "iostream.h"

class LN
{

// Declaration of member variables

public:
char LNName[10];
char LNRef[30];
char Data[100];
struct {float ctVal,stVal,q,t;} Pos;

    // Constructors and destructor
LN(){};
~LN(){};
};



class XCBR
{

// Declaration of member variables

public:
int b;

    // Constructors and destructor
XCBR(){};
~XCBR(){};
};

class LD
{

// Declaration of member variables

public:
char LDName[30];
char LDRef[30];
char LogicalNode[100];

// This could be controled by an "if" sentence
//TVTR TVTR1, TVTR2, TVTR3;
//TCTR TCTR1, TCTR2, TCTR3, TCTR4;
LN *LN;


    // Constructors and destructor
LD()
{
//LN = new XCBR;





}
;
~LD(){};
};

void main()
{

LD LD;
XCBR *temp = (XCBR*)LD.LN;
cout << temp->LNName << endl;
}



pero ahora con temp veo al atributo b de la clase XCBR pero no veo los atributos de LN, estoy equivocado?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa