[C con Clase] Duda sobre herencia 2da parte

Alexis García Báez ybaez en infomed.sld.cu
Vie Mayo 31 01:56:11 CEST 2013


Steven, eres el jodido amooo, testeando ya tu código gracias miles, a lo
mejor para otros era una duda tonta para cualquiera pero nos has sacado de
un aprieto.

Saludos

Alexis y Ernesto

Duda tienes algun tipo de relacion familiar con Chuck Norris?

 

De: Cconclase [mailto:cconclase-bounces en listas.conclase.net] En nombre de
Davidson, Steven
Enviado el: viernes, 31 de mayo de 2013 6:30
Para: Lista de correo sobre C y C++
Asunto: Re: [C con Clase] Duda sobre herencia 2da parte

 

Hola Alexis y Ernesto,

 

2013/5/30 Alexis García Báez <ybaez en infomed.sld.cu>

Saludos de nuevo, aprovecho la oportunidad para agradecer de nuevo a Steven
nos sirvio de mucho ayuda y de no ser por otro percance ya hubiésemos
terminado nuestro proyecto aqui va la 2da duda

Como explique ayer tenemos la clase padre TCourse y las 2 hijas
TProfesorCourse y TEnterpriseCourse, hay una clase TCollectionCourse y una
controladora TEducationalCenter.

Ahora en la clase hija TProfesorCourse hay un atributo llamado Level, que
solo almacena un int, tenemos hicimos una funcion que reciba un int y
devuelva cuantas instancias TProfesorCourse tienen el atributo Level pasado
con igual valor que el int que entramos por parametros, la coleccion que es
de clase padre puede tener las 2 clases hijas eso lo solucionamos con el
casteo dinamico que nos explico Steven, el problema consiste en que pensamos
que puede haber un error a la hora de insertar los datos de las instancias
de TProfesorCourse en el arreglo de TCourse aqui les va el codigo del
insertar.

 

 

La verdad es que tengo que pedir disculpas porque se me olvidó comentar
acerca de un posible error que estabais cometiendo con el puntero,
'ptrCourses'. Creasteis un array dinámico de objetos de la clase 'TCourse',
pero en realidad os interesa crear un array dinámico de punteros a objetos
de la clase 'TCourse'; por ejemplo,

 

TCourse **ptrCourses = new TCourse*[100];  // o la cantidad que sea

 

ptrCourses[0] = new TEnterpriseCourse;

ptrCourses[1] = new TProfesorCourse;

 

Os interesa mantener una lista de objetos polimórficos. Esto implica que
necesitáis manipular los objetos a través de punteros o a través de
referencias; aconsejo usar punteros porque son más flexibles. Obviamente,
necesitáis herencia y que la clase base, 'TCourse' en este caso, tenga
alguna función miembro virtual.

 

Obviamente, esto supone cambiar la forma de trabajar con este puntero,
'ptrCourses'; por ejemplo, el código del correo-e anterior sería ahora:

TProfesorCourse *ProCourse;

...

 

ProCourse = dynamic_cast< TProfesorCourse * >( ptrCourses[i] );

 

porque ahora cualquier elemento de 'ptrCourses' es un puntero a un objeto
polimórfico.

//--------------------------------------------------------------------------
-

[CORTE]

Esos son los 2 insertar, uno para cada clase hija. Traceando el programa
estamos casi seguros que el error esta en la manera de insertar que trunca
los atributos de las clases hijas y mantiene correctamente los de la clase
padre.

 

Sinceramente, no aconsejo crear estas dos funciones miembro, ya que sólo una
es necesaria:

void TCourseCollection :: InsertCourse( TCourse *pCourse )

{

  if( length >= max )

    reallocate();

 

  ptrCourses[length++] = pCourse;  // Meramente copiamos punteros, y no
objetos

}

 

Por herencia, podemos hacer esto:

tc.InsertCourse( new TProfesorCourse );

tc.InsertCourse( new TEnterpriseCourse );

...

 

 

Espero que esto os sirva.

 

Steven

 



--

Este mensaje le ha llegado mediante el servicio de correo electronico 
que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistem
a Nacional de Salud. La persona que envia este correo asume el compromiso de
 usar el servicio a tales fines y cumplir con las regulaciones establecidas


Infomed: http://www.sld.cu/


------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130531/715f5036/attachment.html>


Más información sobre la lista de distribución Cconclase