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

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Mar Dic 24 09:43:59 CET 2013


Buenos días a todos !!!

Y ante todo, muchísimas gracias Steven !!!

Estoy releyendo los ejemplos que mostrastes para ilustrarme las diferentes
posibilidades :

Tengo una duda con este método :

Area2D CrearArea2D( int width, int height = -1 )
{
  static int _height = 0;

  if( height >= 0 )  _height = height;

  return Area2D( width, _height );
}

1 ) ¿ Se puede declarar una variable estática dentro de un método ???
Qué pasa entonces cada vez que se llama a este método, ¿ no se vuelve a
redefinir la variable estática "_height" ???....¿ no se volvería a asignar
el valor "0" ???

2 ) Cuando dices que recomiendas que sea global a qué te refieres, ¿ te
refieres
a que esta función esté definida fuera de la estructura "Area2D" ???
¿ Como un constructor externo ???

PD - Steven, responde si buenamente te apetece y tienes tiempo, que esto es
por seguir aprendiendo.

PD - Creo que son super interesantes los patrones estos de diseño de
constructores externos para automatizar la creación de objetos.


FELIZ NAVIDAD A TODOS !!!!
y FELICIDADES POR ESTE GRANDÍSIMO PROYECTO !!!!


El 20 de diciembre de 2013, 17:23, Davidson, Steven <srd4121 en njit.edu>escribió:

> 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.
>
> _______________________________________________
> 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/20131224/b6bf03b9/attachment.html>


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