61. C++ || Estructuras anidadas



Recordemos que dentro de una estructura podemos declarar cualquier tipo de dato como miembro, incluso un tipo de dato hecho por el usuario con una estructura o clase. Ahora veremos cómo hacer eso y por qué.

En ocasiones veremos que habrá cierta similitud entre muchas cosas, por ejemplo, si quisiéramos hacer una estructura para registrar los datos de un cliente por cada compra en un súper mercado, es normal pensar que vamos a necesitar un programa que lea su nombre, apellido, edad, número de identificación y número de teléfono, ahora, piensen en que si queremos hacer una estructura para almacenar lo datos de una persona que se quiera inscribir en un centro educativo, pediríamos lo mismo.

Las estructuras anidadas tienen más sentido si tomamos como ejemplo, que para inscribir a una persona en ese centro educativo, además de pedir los datos que necesitaríamos para cualquier compra en el súper mercado, también necesitamos la fecha de nacimiento de la persona. Con esto, es necesario ingresar otro miembro a la estructura. ¿Cómo lo haríamos? ¿Crearíamos dos tipos de estructuras? Por ejemplo:

struct Cliente{
 char nombre[20], apellido[20];
 int edad, numeroIdentificacion;
        long telefono;
};

struct Registro{
 char nombre[20], apellido[20];
 int edad, numeroIdentificacion;
        long telefono;
 int dia,mes,anio; //Fecha de nacimiento de la persona
};

¡Por supuesto que no! Esto sólo traería consigo la ineficiencia pura.

Explicaré esto sin entrar en muchos detalles, y terminaré mostrando un ejemplo completo para que se pueda entender de la mejor manera.

Pudiésemos reescribir la estructura para que sea más fácil trabajar con ella, además de anidarla.

//Lo que antes era la estructura Cliente,
//Ahora se llama Persona.
struct Persona{
 char nombre[20], apellido[20];
 int edad, numeroIdentificacion; 
        long telefono;
};

//Una estructura para representar la
//Fecha de nacimiento de una persona.
struct Fecha{
 int dia,mes,anio;
};

//Esta estructura representa el registro
//De una persona a una centro educativo.
//¡Dentro de ella están todos lo campos 
//Solicitados! 
struct Registro{
 //Dos tipos de datos estructura, esto es
 //La anidación
 Persona persona; 
 Fecha fec;
};

Ahora hemos anidado la estructura, es decir, hemos introducido un tipo de dato estructura en los miembros de otra estructura. Ahora la estructura Registro contiene todos los campos para leer el nombre, apellido, edad, número de teléfono, número de identificación y la fecha de nacimiento de cualquier persona que se quiera registrar en el centro educativo.

Las ventajas que trae esto es que sólo hemos de necesitar declarar la estructura una sola vez. Y si otra estructura necesita algunos campos parecidos a la ya declarada, entonces se agrega como miembro de la nueva estructura. Faltaría ver cómo acceder a esos miembros de la estructura anidada. Pero a simples definiciones, se hace igual que como hemos estado haciendo hasta ahora:

  1. Por medio del operador punto (.).
  2. Por medio del operador puntero (->) en caso de que se trate de un puntero a una estructura.

Ejemplo de una estructura anidada en C++


#include <iostream>
using namespace std;

//Lo que antes era la estructura Cliente,
//Ahora se llama Persona.
struct Persona{
 char nombre[20], apellido[20];
 int edad, numeroIdentificacion;
 long telefono;
};

//Una estructura para representar la
//Fecha de nacimiento de una persona.
struct Fecha{
 int dia,mes,anio;
};

//Esta estructura representa el registro
//De una persona a una centro educativo.
//¡Dentro de ella están todos lo campos 
//Solicitados! 
struct Registro{
 Persona persona;
 Fecha fec;
};

int main(){
 Registro nuevoIngreso;
 cout << "Ingrese el nombre" << endl;
 cin.getline(nuevoIngreso.persona.nombre,20);
 
 cout << "Ingrese apellido" << endl;
 cin.getline(nuevoIngreso.persona.apellido,20);
 
 cout << "Ingrese edad" << endl;
 cin >> nuevoIngreso.persona.edad;
 
 cout << "Ingrese numero de identificacion" << endl;
 cin >> nuevoIngreso.persona.numeroIdentificacion;
 
 cout << "Ingrese telefono" << endl;
 cin >> nuevoIngreso.persona.telefono;
 
 cout << "Ingrese dia de nacimiento" << endl;
 cin >> nuevoIngreso.fec.dia;
 
 cout << "Ingrese mes de nacimiento" << endl;
 cin >> nuevoIngreso.fec.mes;
 
 cout << "Ingrese anio de nacimiento" << endl;
 cin >> nuevoIngreso.fec.anio;
 
 system("cls"); //Borra la pantalla.
 
 cout << "Nombre: " << nuevoIngreso.persona.nombre;
 cout << "\nApellido: " << nuevoIngreso.persona.apellido;
 cout << "\nEdad: " << nuevoIngreso.persona.edad;
 cout << "\nNumero de identificacion: " << nuevoIngreso.persona.numeroIdentificacion;
 cout << "\nTelefono: " << nuevoIngreso.persona.telefono;
 cout << "\nDia de nacimiento: " << nuevoIngreso.fec.dia;
 cout << "\nMes de nacimiento: " << nuevoIngreso.fec.mes;
 cout << "\nAnio de nacimiento: " << nuevoIngreso.fec.anio;
 cout << endl << endl << endl;
 return 0;
}

El acceso a miembros dato de estructuras anidadas requiere del uso de múltiples operadores punto. Esto hasta llegar al dato miembro al que se desea acceder.

No hay comentarios