Datenstrukturen mit struct & union
Die struct Variante
Du hast bis jetzt verschiedene Datentypen (int, float, string usw.) kennen gelernt. Mit struct kann eine neue Struktur erstellt werden, in der mehrere Variablen enthalten sind mit verschiedenen Datentypen. Hier mal ein Beispiel:
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <string> // std::string
- #include <stdlib.h> // EXIT_SUCCESS
-
- struct Person
- {
- std::string vorname;
- std::string nachname;
- int alter;
- };
-
- int main(void)
- {
- Person pers;
- pers.vorname = "Johannes";
- pers.nachname = "Kraemer";
- pers.alter = 30;
- std::cout << pers.vorname << " " << pers.nachname << " ist " << pers.alter << " Jahre alt!" << std::endl;
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Es besteht die Möglichkeit, Strukturen zu verschachteln und eine Strukturvariable als Bestandteil einer anderen Struktur zu definieren.
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <stdlib.h> // EXIT_SUCCESS
- #include <string> // std::string
-
- struct Person
- {
- std::string vorname;
- std::string nachname;
- int alter;
- };
-
- struct Gruppe
- {
- std::string ort = "Hillesheim";
- Person pers1;
- Person pers2;
- };
-
- int main(void)
- {
- Gruppe gruppe;
- gruppe.pers1.vorname = "Johannes";
- gruppe.pers1.nachname = "Kraemer";
- gruppe.pers1.alter = 30;
- gruppe.pers2.vorname = "Karla";
- gruppe.pers2.nachname = "Alter";
- gruppe.pers2.alter = 58;
- std::cout << "P1: " << gruppe.pers1.vorname << " " << gruppe.pers1.nachname << " ist " << gruppe.pers1.alter << std::endl;
- std::cout << "P2: " << gruppe.pers2.vorname << " " << gruppe.pers2.nachname << " ist " << gruppe.pers2.alter << std::endl;
- std::cout << "Alle wohnen in " << gruppe.ort << std::endl;
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Eine Struktur kann auch direkt in ein Array geladen werden.
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <stdlib.h> // EXIT_SUCCESS
- #include <string> // std::string, std::to_string
-
- struct
- {
- int id;
- std::string name;
- } alleSpieler[8]; // Array mit Index 8 (erreichbar von 0 bis 7!)
-
- int main(void)
- {
- for (int i = 0; i<8; i++)
- {
- alleSpieler[i].id = i;
- alleSpieler[i].name = "Spieler";
- std::cout << "Spieler " << alleSpieler[i].id << " heisst "
- << alleSpieler[i].name << std::to_string(alleSpieler[i].id+1) << std::endl;
- }
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Eine Struktur kann auch beim instanzieren direkt definiert werden!
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <stdlib.h> // EXIT_SUCCESS
- #include <string> // std::string
-
- struct Person
- {
- int id;
- std::string name;
- };
-
- int main(void)
- {
- Person pers1 = {1, "Johnny"}; // Direkte definition beim instanzieren
- std::cout << "P1 heisst " << pers1.name << std::endl;
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Strukturen können auch mit pointern verwendet werden. Man erkennt es daran, dass nicht ein Punkt sondern ein strich Pfeil verwendet wird. Hier ein Beispiel:
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <stdlib.h> // EXIT_SUCCESS
- #include <string> // std::string
-
- struct Person
- {
- std::string name;
- };
-
- int main(void)
- {
- Person pers1; // Struktur deklarieren
- Person *pPers1; // Pointer deklarieren
- pPers1 = &pers1; // Dem Pointer die Adresse zuweisen
- pPers1->name = "Johnny"; // Struktur über pointer ändern
- std::cout << "P1 heisst " << pPers1->name << std::endl;
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Datenstruktur mit union
Eine Union ermöglicht es, Variablen zu definieren, die sich denselben Speicherbereich teilen. Eine Union setzt sich aus verschiedenen Komponenten zusammen, wobei die Komponenten meist einen unterschiedlichen Datentyp besitzen. Der Speicherplatzbedarf einer Union wird bestimmt durch den Speicherplatzbedarf seiner "größten" Variable. Die Variablen (Members) einer Union teilen sich den Speicherbereich. ACHTUNG: Wenn eine Variable einen neuen Wert zugewiesen bekommt, bekommen alle anderen Variablen die vorher definiert wurden irgendeinen Speicherbereich zugewiesen!
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <stdlib.h> // EXIT_SUCCESS
-
- union Unionstruktur
- {
- int a; // 4 Byte
- float b; // 4 Byte
- double c; // 8 Byte
- };
-
- int main(void)
- {
- Unionstruktur u1;
- u1.a = 10;
- std::cout << u1.a << std::endl; // 10
- u1.b = 2.574f;
- std::cout << u1.a << std::endl; // 1076149354
- u1.c = 3.654;
- std::cout << u1.a << std::endl; // 1511828488
- std::cout << u1.c << std::endl; // 3.654
-
- std::cout << sizeof (Unionstruktur) << std::endl; // 8 Byte
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Mit Union kann genauso verfahren werden wie mit struct (Pointer, Verschachtelung usw..)
Die Members von Strukturen und Unions sind öffentlich zugänglich (public), wenn nichts anderes vereinbart wird. Wie bei Klassen kann der Zugriff auf protected oder private eingeschränkt werden. (Der einzige Unterschied zwischen einer Klasse und einer Struktur besteht in C++ tatsächlich darin, dass der Default-Zugriff bei einer Klasse private ist, bei einer Struktur hingegen public.)