FSST - Hardwarenahe Programmierung

Statische Elemente

Vererbung in C++

Während Elementvariablen für jedes Objekt einmal angelegt werden, existieren statische Elementvariablen pro Klasse exakt einmal, egal wie viele Objekte dieser Klasse erzeugt werden. Sie werden angelegt, bevor das erste Objekt der Klasse erzeugt wird. Eine Anwendung für eine solche Variable könnte das Zählen der instanziierten Instanzen sein. Dazu wird die statische Variable in jedem Konstruktor inkrementiert (Zeile 5 im folgenden Code) und in jedem Destruktor (Zeile 7) dekrementiert. In der statischen Variable kann dann abgelesen werden, wie viele Objekte dieser Klasse derzeit existieren.

Statische Variable und Methoden

class DigitalAus : public DigitalOut
{
    public:
    DigitalAus(PinName ld) : DigitalOut(ld){   // Konstruktor
        staticCounter++;
    }
    ~DigitalAus(){        // Destruktor
        staticCounter--;
    }
    static int howMany() {    // Statische Methode
        return staticCounter;
    }
    private:
    static int staticCounter;   // Statische Elementvariable
};

int DigitalAus::staticCounter = 0;

DigitalAus led(LED1);   // Erzeugen von drei Instanzen
DigitalAus led2(LED2);
DigitalAus led3(LED3);

int main() {
    while (1) {
        {
            DigitalAus led3(LED3);   // erzeugen einer weiteren Instanz
            printf("Anzahl Instanzen: %d\n", DigitalAus::howMany());   // Ausgabe: 4
        }
        // Destruktor wird aufgerufen
        printf("Anzahl Instanzen: %d\n",  DigitalAus::howMany());  // Ausgabe: 3
        //

Deklaration

Eine statische Elementvariable wird genauso wie jede andere Elementvariable der Klasse in Zeile 14 deklariert. Es wird ihr allerdings das Schlüsselwort static vorangestellt. Weiters muss sie noch separat von der Klasse global definiert werden (Zeile 17), wo sie auch z.B. mit 0 initialisiert wird.

Statische Funktionen

Statische Funktionen (Zeile 10 bis 12) haben mit statischen Variablen gemein, dass sie zur Klasse gehören, aber unabhängig von der Zahl oder der Existenz von Objekten verwendet werden können. Statische Funktionen werden aufgerufen, indem der Klassenname, zwei Doppelpunkte und der Funktionsname genannt werden (siehe Zeile 26). Für den Aufruf muss also kein Objekt der Klasse existieren.

Im obigen Code wird die Klasse DigitalAus drei Mal instanziiert (Zeile 19 bis 21) und daher wird in Zeile 30 der Wert 3 ausgegeben.

Frage: Warum wird in Zeile 30 drei (3) ausgegeben und nicht vier (4)?


All wikipages