• Miércoles 15 de Mayo de 2024, 18:04

Autor Tema:  Clases abstractas  (Leído 1743 veces)

rgpsolocodigo

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Clases abstractas
« en: Miércoles 8 de Abril de 2009, 20:54 »
0
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;
}


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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases abstractas
« Respuesta #1 en: Miércoles 8 de Abril de 2009, 21:44 »
0
La clase LN no tiene ningun miembro llamado b ... y tu variable LN es un puntero de esa clase.

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

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rgpsolocodigo

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Clases abstractas
« Respuesta #2 en: Miércoles 8 de Abril de 2009, 22:04 »
0
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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases abstractas
« Respuesta #3 en: Jueves 9 de Abril de 2009, 00:33 »
0
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;

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rgpsolocodigo

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Clases abstractas
« Respuesta #4 en: Lunes 13 de Abril de 2009, 20:29 »
0
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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases abstractas
« Respuesta #5 en: Lunes 13 de Abril de 2009, 20:49 »
0
¿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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rgpsolocodigo

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Clases abstractas
« Respuesta #6 en: Lunes 13 de Abril de 2009, 21:27 »
0
MM, excelente. No se si eternal pero si idol