[C con Clase] "Punteros" a clase

Rafael Arias Michel rgam496 en gmail.com
Dom Oct 28 07:44:41 CET 2012


Muchas gracias por su respuesta, Steven.

Podrá apreciar que justamente quería evitar el uso la estructura switch,
je, je.

Consideré como posible reemplazo, utilizando punteros a funciones, diseñar
funciones como:

typedef A* (*GeneradorA)();

A* GenerarNuevaB() {return new B();}
C* GenerarNuevaC() {return new C();}

¿Será válido lo siguiente?

GeneradorA fA;
fA = GenerarNuevaB;
A* varB = fA();
fA = GenerarNuevaC;
A* varC = fA();


Una vez más, muchas gracias por toda su ayuda.

Saludos.


El 28 de octubre de 2012 00:40, Davidson, Steven <srd4121 en njit.edu>escribió:

> Hola Rafael,
>
> 2012/10/23 Rafael Arias Michel <rgam496 en gmail.com>:
> > Gracias por su respuesta.
> >
> > Sí, sé que el polimorfismo te permite muchas cosas.
> >
> > Sé que puede realizarse lo siguiente con polimorfismo:
> > A *varB = new B();
> > A *varC = new C();
> >
> > Pero mi duda es si puedo realizar algo similar a esto:
> > pA = B;
> > A *varB = new pA; // A *varB = new B();
> > pA = C;
> > A *varC = new pA // A *varC = new C();
> >
> > Considerando que B y C heredan propiedades de A.
> >
>
> Dinámicamente, C++ no te permite tal manejo de tipos, porque los tipos
> no se guardan en el programa compilado. Lo que sí podrías hacer es
> obligar a C++ a usar la RTTI: Información de Tipo en Tiempo de
> Ejecución. Con esto, puedes consultar acerca de los tipos, pero sigue
> siendo un manejo limitado, ya que te permite determinar si los tipos
> son iguales o no.
>
> > Sucede que estoy con un proyecto en el cual quiero dar a elegir al
> usuario
> > cuál clase se empleará para construir una serie de objetos, de modo que
> la
> > clase elegida pase a ser pA. Se podrá elegir siempre de cualquier clase
> que
> > sea una extensión de clase A.
> > Cada objeto que cree debe ser del tipo indicado por pA, y no está
> > previamente definido cuántos podré crearlos.
> > En un menú de opciones daré a elegir qué clase querrá usar (si será la B
> o
> > la C).
> >
>
> La terminología que estás usando describe la POO y el polimorfismo a
> la perfección.
>
> > Daré otro ejemplo de lo que pretendo, con algo más concreto:
> >
> > class A
> > {
> > virtual double f(double x);
> > };
> >
> > class B: public A
> > {
> > double f(double x) {return 5;}
> > };
> >
> > class C: public A
> > {
> > double n = 0;
> > double f(doble x) {return n++;}
> > }
> >
> > Si en el menú indico que usaré siempre la clase B, entonces pA deberá
> hacer
> > referencia a B, de modo que:
> > A *var[4];
> > for (int i = 0; i < 4; i++)
> > var[i] = new pA();
> > Entonces, si yo ejecuto var[3].f(7), me devolverá 5. Ahora, si pA hacía
> > referencia a C:
> > var[2].f(3) me devolverá 0.
> > var[1].f(5) me devolverá 0.
> > var[2].f(2) me devolverá 1.
> > var[0].f(2) me devolverá 0.
> >
> > ¿De qué modo podría yo implementar a pA en C++? En caso de no ser
> posible,
> > ¿qué sería lo más cercano a pA? ¿Tendré que usar punteros a funciones
> para
> > crear nuevos objetos de clases generalizables por A, o hay otra
> estrategia?
> >
>
> Como he mencionado antes, esto es justamente la idea tras el
> polimorfismo, pero no tenemos que saber el tipo de dato para poder
> invocar la función miembro debida, sino que el mecanismo de
> polimorfismo ya toma en cuenta esto y elige correctamente la función
> que queremos. En tu menú, instancia el objeto polimórfico de la clase
> correcta según la elección del usuario y el comportamiento de tu
> programa. Por ejemplo,
>
> A *pObj;
>
> int opcion;
> cin >> opcion;
>
> switch( opcion )
> {
>   case 1:
>     pObj = new A;
>     ...
>   break;
>
>   case 2:
>     pObj = new B;
>     ...
>   break;
>
>   case 3:
>     pObj = new C;
>     ...
>   break;
> }
>
> Después de esto, ya puedes invocar las funciones miembro que quieres,
> y el sistema de polimorfismo elegirá la "versión correcta" de cada
> función miembro. Todo esto sucede sin necesidad de manipular
> directamente los tipos de datos; sólo invocamos las funciones que
> queremos, y el polimorfismo se encarga de elegir los detalles ya
> definidos.
>
>
> Espero que esto te ayude.
>
> Steven
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20121028/d945c5cf/attachment-0001.html>


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