[C con Clase] Estructuras

Salvador Pozo salvador en conclase.net
Jue Sep 11 13:23:44 CEST 2008


El pasado 2008-09-11 07:22:19, Arkiant escribió:
 
A> Hola a todos los miembros,

Hola, bienvenido.

A> estoy empezando a aprender C y C++ con el curso de esta misma página.
A> Al llegar al tema de las estructuras se me plantea una duda:

A> struct Monstruo
A> {
A>     char Nombre[50];
A> } Abes;
A> Puedo ahora por ejemplo hacer esto:
A> struct Monstruo
A> {
A>     char Nombre[50];
A> } OvejaDollye;
A> Asi me imagino que podria hacer una segunda version de Monstruo, se que se podria hacer esto tambien:
A> struct Monstruo
A> {
A>     char Nombre[50];
A> } Abes, OvejaDollye;

En la primera parte hay un error, no puedes redefinir la estructura Monstruo, la única opción para lo que planteas es la que haces al final, ya sea declarando los dos objetos (variables) en la misma sentencia de declaración, como lo has hecho, o declarando el segundo objeto de forma separada:

struct Monstruo OvejaDollye;

En C++ podemos prescindir de la palabra struct:

Monstruo OvejaDollye;

A> Pero de esta forma si quiero inicializar algunas variables por defecto serian las dos iguales y si quiero hacer algo como:
A> struct Monstruo
A> {
A>     char Nombre[50];
A>     const static int Vida = 50;
A> } Abes;
A> Y luego OvejaDollye con por ejemplo 100 Vida no se podria hacer conjuntamente como en el ejemplo anterior con Abes, OvejaDollye.

Aquí hay varios conceptos mezclados.

Lo que estás haciendo en este ejemplo es declarar un miembro estático, (además de constante). Eso no es lo que generalmente se entiende por variables por defecto.

Los miembros estáticos deben inicializarse siempre, eso es obligatorio. Además, se comparten para todos los objetos declarados del mismo tipo de estructura. Todos los objetos del tipo "Monstruo" tendrán el mismo valor para Vida, ya que ese valor se almacena en una única posición de memoria para todos ellos.

En el curso de "C con Clase" no se habla de miembros estáticos ni constantes para estructuras (incluiré algo sobre ese tema en futuras revisiones), esto sólo se menciona con las clases.

Sin embargo, la idea es similar en ambos casos. Los miembros estáticos han de ser inicializados. Si son constantes, además, sólo se podrá hacer una vez.

Se puede hacer como lo has hecho en tu ejemplo, o fuera de la declaración:

struct Monstruo
{
    char Nombre[50];
    const static int Vida;
} Abes;

const int Monstruo::Vida = 50;

En este caso, el valor de Vida no puede ser modificado.

Si se define sólo como "static int Vida", sí podrá modificarse le valor, pero se hará para todos los objetos de tipo Monstruo simultánemente.

A> Y otra cuestión mas que se me plantea es:
A> Si para inicializar una variable con un valor pongo const static int NombreVariable = Valor para un Valor de tipo int como puedo hacer para inicializar la variable char Nombre[50] = "Abes"; como haríamos con una variable normal? he probado con const static y no me funciona el compilador me dice que no puede ser static un valor char.

Yo optaría por formas diferentes en caso de miembros estáticos de cadena constantes y no constantes.

Si se trata de no constantes, puedes hacer la declaración fuera de la estructura, como indiqué anteriormente:

struct Monstruo
{
    static char Nombre[50];
    const static int Vida;
} Abes;

const int Monstruo::Vida = 20;
char Monstruo::Nombre[50] = "Abes";

De este modo puedes cambiar el valor del miembro Nombre durante la ejecución, igual que para cualquier otro miembro:

    strcpy(Abes.Nombre, "Gran Abes");

Si se trata de una constante, no es necesario usar un array, puedes usar un puntero, ya que no vamos a modificar el valor, no tiene sentido calcular la longitud de la cadena:

struct Monstruo
{
    const static char *Nombre;
    const static int Vida;
} Abes;

const int Monstruo::Vida = 20;
const char *Monstruo::Nombre = "Abes";

A> Espero sus respuestas y espero no haberos causado muchas molestias ^^.

Nunca es una molestia responder a las preguntas.

Mucho menos si son tan interesantes como estas. Gracias a ellas he visto que faltan algunos conceptos por aclarar en el curso, y podré mejorarlo. Gracias a ti.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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