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

Davidson, Steven srd4121 en njit.edu
Mie Dic 18 19:59:13 CET 2013


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


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