Imbricarea înregistrărilor
Principiul de înregistrări imbricate are ca sinonim denumirea populară „struct în struct”. Acest principiu ne permite modelarea unor structuri de date mai complexe, formate din mai multe componente.
Știm din declararea unui struct că putem alege orice tip de dată pentru câmpurile din interior. Bineînțeles, în această categorie intră inclusiv alte înregistrări declarate de noi, prin care noi astfel obținem imbricarea struct-urilor.
Declararea imbricată
Un exemplu în care ne este folositoarea imbricarea este acela în care am dori să memorăm detalii despre o entitate Cerc.
struct Punct {
float x, y;
};
struct Cerc {
Punct centru;
float raza;
};
Detaliile pe care dorim să le memorăm sunt: raza cercului și coordonatele centrului. Deoarece acest centru este un punct în plan, vrem de fapt să reținem coordonatele acestuia, reprezentate avantajos prin structura Punct.
Putem defini un struct direct în alt struct, nefiind necesară includerea unui identificator (nume de variabilă). Exemplul anterior ar deveni:
struct Cerc {
struct {
float x, y;
} centru;
float raza;
};
Pentru claritate, această a doua variantă nu este recomandată. În plus, nu avem posibilitatea de a refolosi structura declarată în alt loc în program, ceea ce creează o ambiguitate în cod.
Accesarea câmpurilor
La fel ca la înregistrările simple, fiecare câmp este accesat prin operatorul punct (.). Dacă un câmp este la rândul lui un struct, câmpurile se accesează succesiv.
Cerc c;
c.centru.x = 1.5;
c.centru.y = 2.0;
c.raza = 3.2;
Exemplu complet
#include <iostream>
using namespace std;
struct Punct {
float x, y;
};
struct Cerc {
Punct centru;
float raza;
};
int main() {
Cerc C;
cout << "Coordonatele centrului: ";
cin >> C.centru.x >> C.centru.y;
cout << "Raza: ";
cin >> C.raza;
float lungime = 2 * 3.14 * C.raza;
float arie = 3.14 * C.raza * C.raza;
cout << "Lungimea cercului: " << lungime << endl;
cout << "Aria: " << arie << endl;
return 0;
}
> Coordonatele centrului: 2 3
> Raza: 5
Lungimea cercului: 31.4
Aria: 78.5