FSST - Hardwarenahe Programmierung

Einleitung Klassen

Klassen in C++

Eine Klasse ist der Bauplan für einen benutzerdefinierten Datentyp. Wird von diesem Datentyp eine Variable im Speicher angelegt (instanziiert), entsteht eine Instanz einer Klasse bzw. ein Objekt. Von einer Klasse können mehrere Objekte erzeugt werden, die sich durch ihren aktuellen Zustand, also die Werte ihrer Membervariablen definiert ist und wo sie im Speicher angelegt wurden. Bei den Membervariablen unterscheidet man:

  • lnstanzvariablen: Variable, die für jedes Objekt neu angelegt werden und nur für die jeweiligen Objekte gültig sind
  • Klassenvariablen: statische Variable, die unabhängig von Objekten nur für diese Klasse existieren.

Erzeugung neuer Klassen

Die Erzeugung neuer Klassen wird am Anfang des Programms im Deklarationsteil - also oberhalb von main() - geschrieben. Die allgemeine Form für die Erzeugung einer neuen Klasse erfolgt mit dem Schlüsselwort class:

class Klassenname 
{
    Zugriffsspezifizierer 1:
        Member;
    Zugriffsspezifizierer 2:
        Member;
}  ObjektNamen;

In Zeile 1 ist Klassenname eine gültige Kennung für die Klasse und in Zeile 7 sind ObjektNamen eine optionale Liste von Namen für Objekte bzw. Instanzen dieser Klasse. Der Körper der Deklaration (Zeile 3...6) enthaltet Member (Mitglieder, Klassenmember), die Daten (Attribute, Eigenschaften) bzw. in C++ Membervariable und Funktionsdeklarationen (der Methoden, Befehle), und wahlweise Zugriffsspezifizierer (access specifiers) für die Sichtbarkeit der Member (public, protected and default private).

Klassen

  • sind Baupläne zur Beschreibung eines Objekts.
  • abstrahieren das Aussehen und Verhalten eines bestimmten Objekttyps.
  • bieten eine Schablone, um Objekte abstrakt zu beschreiben.
  • definieren Eigenschaften auch Attribute (Daten/Membervariable) und Befehle/Methoden die alle Objekte eines bestimmten Typs besitzen.

Klassen deklarieren

  • beginnt mit dem Schlüsselwort class. Dem Schlüsselwort folgt der Name der Klasse. Daten bzw. die Membervariablen (in UML als Attribute bezeichnet) und Memberfunktionen bzw. Methoden (in UML als Operationen bezeichnet) werden mit Hilfe der geschweiften Klammern zu einer Struktur zusammengefasst.
  • endet mit einem Semikolon.
  • wird nie innerhalb der main-Funktion definiert, sondern
    1. außerhalb von main() – vorher im Deklarationsteil
    2. Häufig werden sie in Header-Dateien ausgelagert.

Regeln für Klassennamen

Es können die Buchstaben a...z, A...Z, die Zahlen 0...9 sowie der Unterstrich genutzt werden.
Klassennamen beginnen mit einem Großbuchstaben (PascalCasing)
Unterscheidung zwischen Groß- und Kleinschreibung
Nutzen Sie aussagekräftige Namen.
Der Oberbegriff aus der realen Welt sollte auch für die dazugehörige Klasse in C++ genutzt werden.
Jedes Teilwort eines Klassennamen beginnt mit einem Großbuchstaben.
Schlüsselwörter der Programmiersprache C++ dürfen nicht genutzt werden.
Klassen entsprechen Substantiven (Hauptwörtern) in einer Projektbeschreibung.

OOP Begriffe

class RTC
{
	I2C i2c;	// Das Objekt i2c wird von der Klasse I2C instanziiert
public:
	// Standard und parametrisierter Konstruktor und Destruktor sind 
	// spezielle Methoden und haben den gleichen Namen wie die Klasse
	RTC() : i2c(p28, p27) // Standardkonstruktor: i2c(p28, p27) bedeutet 
	{ ... }	              // die Pins 28 und 27 an den i2c Konstruktor zu schicken
    RTC(PinName sda, PinName scl) : i2c(sda, scl)	// parametrisierten Konstruktor, wobei die aktuellen	
	{ ... }                    // Parameter sda, sdc an den i2c Konstruktor geschickt werden.
    ~RTC();	// Destruktor wird löschendes Objekts aufgerufen

	// Die Methoden (Memberfunktionen) bilden die Schnittstelle (Interface) einer Klasse
	// nach aussen und wirken auf die Eigenschaften   (Memebervariablen)  
    void rtc_init();     
    char rtc_read(char address);     
};

int main()
{
	// Objekte sind Instanzen von Klassen, es wird die Objektvariable (myRTC bzw. rtc) erzeugt
	RTC myRtc;	       // Aufruf des Standardkonstruktors
	RTC rtc(p28, p27); // Aufruf des parametrisierten Konstruktors

	rtc.rtc_init();    // Zugriff auf die Member (rtc_init) der Objektvariable (rtc) mit dem Punktoperator 
         
	return 0;
}

AddOn: Objekte dynamisch erzeugen mit Zeiger (Pointer) - NICHT für Mikrocontroller geeignet, da der Speicher erst zur Ausführungszeit fest steht.

int main()
{
  // Objekte dynamisch erzeugen
  RTC *pRtc;          // Zeiger vom Type der Klasse RTC

  pRtc = new RTC;     // Mit new wird Speicher wird auf dem Heap reserviert
  pRtc = new RTC(p28, p27); // Speicher mit parametrisierten Konstruktor reserviert

  pRtc->rtc_init();   // Auf die Memeber wird über den Operator -> zugegriffen
  delete pRtc;        // Speicher frei geben
	return 0;
}

Membervariable


All wikipages