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

Davidson, Steven srd4121 en njit.edu
Vie Dic 20 17:23:36 CET 2013


Hola Miguel Ángel,

2013/12/20 Miguel Ángel Torres Fernández-Píñar <
miguelangeltorresfp en gmail.com>

> 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.
>
>
El lenguaje es una herramienta para ayudar en la comunicación con la
máquina. Lo que hace falta es saber cómo comunicarse. No basta con saber
las palabras francesas para hablar francés, hay que saber cómo expresarse
también.

En la programación y en ciertos lenguajes, verás que hay varias formas de
hacer la misma cosa. No es correcto elegir una solución de entre varias,
sino razonar cada una y elegir la mejor que se adapte a las circunstancias
presentadas por el problema entre manos. Dependiendo del problema,
elegiremos una solución u otra. Por eso hay que pensar en el problema y
fijarse en las necesidades: las partes importantes.

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.
>
>
Podrías hacer eso, pero no sería igual a lo que mencioné, porque tienes que
guardar ese dato en la clase y por tanto pertenece a los objetos que estás
creando. Esto implica que creas el objeto base justo antes que el objeto
actual (el derivado ), por lo que no tienes tiempo para guardar la variable
de la clase base, que quieres usar como valor inicializador, para poder
usarla en la instanciación del objeto (derivado). Es decir, quieres hacer
esto:

struct Area2D_Base
{
  int nHeightInit;

  Area2D_Base( int h ) : nHeightInit(h)  {}
};

struct Area2D : public Area2D_Base
{
  int width, height;

  Area2D( int w, int h ) : Area2D_Base(h), width(w),
height(Area2D_Base::nHeightInit)  {}
};

No hay otra forma de dar el valor inicial a 'nHeightInit' ni tampoco
podemos usarla antes de ser creada, porque básicamente creamos el objeto
'Area2D_Base' dentro de la misma creación del objeto "propio" de 'Area2D'.

Lo que sí podrías hacer es usar una variable estática, pero entonces no
hace falta usar herencia; esto es,

struct Area2D_ValorInicial
{
  static int nHeightInit;
};

struct Area2D
{
  int width, height;

  Area2D( int w, int h ) : width(w), height(h)
 { Area2D_ValorInicial::nHeightInit = h; }
  Area2D( int w ) : width(w), height(Area2D_ValorInicial::nHeightInit)  { }
};

Aquí, realmente estás usando la variable estática como una variable global,
pero con menores peligros.

Como te digo, la forma "más POO" de hacer esto es que todo quede
encapsulado en su propia estructura o clase, para que cada objeto manipule
su propia información. Manteniendo dos clases separadas representa dos
conceptos separados. En realidad, lo que propuse se parece más al patrón de
la fábrica: un objeto simplemente sirve para instanciar objetos de otra
clase, como una fábrica que va sacando productos de igual fabricación.


Espero que esto aclare el tema.

Steven

P.D.: Feliz Navidad a todos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20131220/6529ffc9/attachment.html>


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