Allgemeiner Aufbau einer Struktur

Einführung

In C gab es bereits Strukturen, als mit C++ jedoch die Klassen eingeführt wurden, hat sich die OOP weitgehend verbessert. Doch dazu später: Zuerst werde ich auf den Aufbau einer Struktur eingehen, wie sie in C üblich war und wie sie speziell in der Windowsprogrammierung weit verbreitet ist.
In einer Struktur lassen sich Daten zusammenfassen. Angenommen wir wollen Rechtecke mit ihren Längen und Breiten bearbeiten. Mann könnte nun jede Länge und Breite separat speichern oder sie mit Hilfe von Strukturen kombinieren. Dies macht zum einen den Quellcode übersichtlicher zum anderen lassen sich Strukturen leicht um Daten erweitern.

Deklaration

Die allgemeine Deklaration von Strukturen sieht folgendermaßen aus:

struct <structname> 
{ 
	<Datatype> <Data>; 
	<Datatype> <Data>; 	
	... 
}; 

oder

typedef struct 
{ 
	<Datatype> <Data>; 
	<Datatype> <Data>; 
	... 
}<structname>;

Greift man noch einmal das Rechteckbeispiel auf, dann könnte eine entsprechende Struktur wie folgt deklariert werden:

struct RECTANGLE 
{ 
	unsigned long ulWidth; 
	unsigned long ulHeight; 	
};

Ein eigener Datentyp 

Im folgenden kann 'RECTANGLE' praktisch als eigener Datentyp aufgefasst werden. Genauso wie mit allen herkömmlichen Datentypen lassen sich auch hier Variablen (bzw. Instanzen oder Objekte) deklarieren. Im Programm könnte das etwa so aussehen:

RECTANGLE rect;

Im Prinzip sind 'ulWidth' und 'ulHeight' ebenfalls Variablen. Allerdings sind sie in einem Block bzw. in einer Struktur zusammengefasst. Man nennt sie auch "Membervariablen" der Struktur 'RECTANGLE'

Soll das Rechteck gleich mit Daten initialisiert werden, so z.B. mit der Breite 600 und der Höhe 480, dann lässt sich das wie folgt realisieren:

RECTANGLE rect = {600, 480};

Dann muss allerdings die Reihenfolge bekannt sein, in der Breite und Höhe gespeichert sind. Nach der Deklaration einer Variablen (bzw. Instanz), lassen sich die Daten auch einfacher schreiben und lesen. 

Zugriff auf die Membervariablen

Soll beispielweise die Breite eines Rechtecks nachträglich geändert werden, dann erreicht man dies über die folgende Notation:

//Deklaration einer RECTANGLE-Instanz
RECTANGLE rect = {600, 480};

//Ändern der Breite
rect.ulWidth = 500;

Indem man den Namen einer Instanz und den Namen irgendeiner ihrer Membervariablen durch einen Punkt trennt, ermöglicht man einen einfachen Zugriff auf diese Membervariable.

Übrigens ist es durchaus möglich, dass eine Membervariable einer Instanz ebenfalls wiederum eine Instanz mit eigenen Membervariablen ist. So ist folgende Deklaration durchaus legitim:

struct FIGURE
{
	RECTANGLE 	rect;
	unsigned long	color;
};

Wird jetzt eine "Figur" deklariert, dann könnte das in etwa so aussehen:

//Deklaration
FIGURE figure;

//Setzen der Membervariablen
figure.rect.ulWidth	=	600;
figure.rect.ulHeight	=	480;
figure.color		=	0;

Dies bedarf wohl keiner weiteren Erklärung.

Zeiger auf eine Instanz

Natürlich lassen sich auch Zeiger (und auch Referenzen) von Strukturen bilden:

//Deklaration einer RECTANGLE-Instanz
RECTANGLE rect = {600, 480};

//Zeiger auf die Instanz
RECTANGLE *prect = &rect;

Für den Zugriff auf die einzelnen Membervariablen gibt es zwei Möglichkeiten. Die naheliegende Methode ist, dass man zunächst den Zeiger dereferenziert und dann wie gewohnt auf die einzelnen Membervariablen zugreift, also:

(*prect).ulWidth	=	800;
(*prect).ulHeight	=	600; 

Speziell für Zeiger gibt es aber noch eine andere Möglichkeit. Für Zeiger, welche auf Objekte von Strukturen (oder Klassen) zeigen, existiert der Operator '->' um auf die einzelnen Membervariablen zugreifen zu können. Das letzte Beispiel lässt sich somit auch wie folgt notieren:

prect->ulWidth		=	800;
prect->ulHeight		=	600;

Für die nächsten Lektionen

Neben der Deklaration und Aufbau einer Struktur wurde hier auch der Begriff der Membervariablen geklärt.  Außerdem wurden zwei neue Operatoren für den Zugriff auf Membervariablen definiert. Die gesamte Funktionalität einer Struktur, die hier aufgezeigt wurde, soll nur eine Einführung sein. In den folgenden Lektionen werden Klassen eingeführt, die die gesamte Funktionalität einer Struktur besitzen aber darüber hinaus noch ein ganzes Stück eigene für Klassen spezifische Funktionalität mitbringen.

Nach oben Weiter