SoloCodigo
Programación General => C/C++ => Visual C++ => Mensaje iniciado por: rgpsolocodigo en Miércoles 8 de Abril de 2009, 20:54
-
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:
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;
}
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
-
La clase LN no tiene ningun miembro llamado b ... y tu variable LN es un puntero de esa clase.
-
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
-
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;
-
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?
-
¿Y a donde fue a parar esta parte?
class XCBR : public LN
class LD : public LN
XCBR y LD ya no heredan nada de LN ........... sino funcionaria "perfectamente" (no se que esperas ver en pantalla la verdad, en ningun momento inicializas LNName y comentaste el new en el constructor de LD).
PD. La cabecera es iostream, supongo que estaras usando algun compilador de Borland.
-
MM, excelente. No se si eternal pero si idol