[C con Clase] Duda sobre herencia 2da parte

Davidson, Steven srd4121 en njit.edu
Vie Mayo 31 06:29:35 CEST 2013


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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130531/5d22f0c7/attachment-0001.html>


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