[C con Clase] Duda de novato - herencia con estructuras.

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Vie Dic 20 07:01:57 CET 2013


Muchas gracias Steven como siempre por tomarte tu tiempo en responder.

Y me doy cuenta de que para llegar a ser un buen programador, aparte de
conocer muy bien el lenguaje, hay que desarrollar muchísimo el ingenio.

Creo que la segunda opción que comentas en realidad es parecida a si
creamos una estructura base y hacemos que las demás hereden de ella, no ???

Eso, feliz navidad a todos, y en especial a tí Steven, que siempre estás
ayudando a los demás.


El 18 de diciembre de 2013, 19:59, Davidson, Steven <srd4121 en njit.edu>escribió:

> Hola Miguel Ángel,
>
> 2013/12/15 Miguel Ángel Torres Fernández-Píñar <
> miguelangeltorresfp en gmail.com>
>
>> Hola, un saludo a tod en s :
>>
>>
> [CORTE]
>
> ¿ Cómo podría hacer para no tener que estar inicializando estas
>> propiedades ( con el mismo valor ) en cada una de las instancias ?.
>>
>>
> Varios socios te han contestado, pero quiero agregar a la discusión. Tal y
> como explicas, lo que quieres es una forma sencilla y automatizada de pasar
> el mismo valor para el campo "height" para cualquier objeto instanciado.
>
> No recomiendo usar un miembro estático para solucionar este problema,
> porque tal campo no describe el concepto del tipo de dato que estás
> definiendo. Tu problema es a la hora de instanciar; no de diseño.
>
> En estos casos, la solución es crear una interfaz de mayor nivel; en
> inglés, se suele hablar de "front end". Digamos que tienes esto:
>
> struct Area2D
> {
>   int width;
>   int height;
>
>   Area2D( int w, int h ) : width(w), height(h)  {}
> };
>
> La solución es crear una función que automatice lo que quieres; recomiendo
> que tal función sea global:
>
> Area2D CrearArea2D( int width, int height = -1 )
> {
>   static int _height = 0;
>
>   if( height >= 0 )  _height = height;
>
>   return Area2D( width, _height );
> }
>
> Aquí sí usaríamos la variable estática para que 'CrearArea2D()' "recuerde"
> el valor original que se le pasó. Esto significa que la primera llamada
> tiene que tener el valor de 'height', pero no para las subsiguientes
> llamdas. Por ejemplo,
>
> Area2D a = CrearArea2D( 10, 20 );
>
> // Ahora usaremos 20 para 'height'
> Area2D b = CrearArea2D( 16 );
> Area2D c = CrearArea2D( 57 );
> Area2D d = CrearArea2D( 100 );
>
> En el ejemplo anterior, 'height' no acepta valores negativos. Si esto no
> es tu caso y no tienes un valor inválido que puedes considerar especial
> para este campo, entonces sugiero usar un puntero. Esto es,
>
> Area2D CrearArea2D( int width, const int *pHeight = nullptr )
> {
>   static int height = 0;
>
>   if( pHeight )  height = *pHeight;
>
>   return Area2D( width, height );
> }
>
> Esto implica que debes pasar una variable, y no un valor literal.
>
>
> De todas maneras, esta solución no es la mejor desde el punto de vista de
> la Programación Orientada a Objetos. La solución es crear otra clase. Por
> ejemplo,
>
> struct Area2D_Bonita
> {
>   int height;
>
>   Area2D_Bonita( int h ) : height(h)  {}
>
>   Area2D Crear( int width )  {  return Area2D( width, height ); }
> };
>
> Y así, haríamos esto:
>
> Area2D_Bonita a2db( 20 );
>
> Area2D a = a2db.Crear( 10 );
> Area2D b = a2db.Crear( 16 );
> Area2D c = a2db.Crear( 57 );
> Area2D d = a2db.Crear( 100 );
>
>
> Sin embargo, como mencionó Programante, dudo que vayas a escribir tantos
> objetos explícitamente. Lo normal es crear cada objeto en un tipo de
> contenido o de agregado, como por ejemplo un array, una lista dinámicamente
> enlazada, un árbol, etc..
>
>
> Espero que todo esto te sea de ayuda.
>
> 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/20131220/a3228727/attachment.html>


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