Statische Member

Statische Eigenschaften

Statische Eigenschaften sind Eigenschaften, die für alle Objekte einer Klasse nur einmal vorhanden sind. Sie werden standardmäßig mit 0 initialisiert.

Eine Eigenschaft wird als statische Eigenschaft definiert, indem vor dem Datentyp der Eigenschaft inline static angegeben wird.

#include <print>
#include <string>
#include <string_view>

// Klassendefinition
class Window
{
    inline static unsigned short noOfWin;
    std::string title;
public:
    // ctor
    Window(std::string_view _title): title(_title)
    { }
    // dtor
    ~Window()
    { }
};

int main()
{
    Window win1("1. Fenster");
}

Alternativ kann eine statische Eigenschaft innerhalb der Klasse deklariert und außerhalb der Klasse definiert werden.

// Klassendefinition
class Window
{
   ...
  static unigned short noOfWin; // static Deklaration
  ...
};
// static Definition
unsigned short Window::noOfWin;

Der Zugriff auf eine statische Eigenschaft aus einer Methode seiner Klasse heraus erfolgt wie der Zugriff auf die sonstigen Eigenschaften. Ist die statische Eigenschaft public, kann auch von außerhalb der Klasse ohne Bezug auf ein Objekt auf diese Eigenschaft zugegriffen werden. Dabei ist vor den Eigenschaftsnamen der Klassenname anzugeben. Alternativ kann anstelle des Klassennamens auch ein Objekt angegeben werden.

#include <print>
#include <string>
#include <string_view>

// Klassendefinition
class Window
{
    std::string title;
public:
    // ctor
    Window(std::string_view _title): title(_title)
    {
        noOfWin++;
    }
    // dtor
    ~Window()
    {
        --noOfWin;
    }
    void Draw()
    {
        std::println("{} Fenster: {}",noOfWin,title);
    }
    // Statische Eigenschaft ist nun public
    inline static unsigned short noOfWin;
};

int main()
{
    Window win1("1. Fenster");
    if (Window::noOfWin != 0)
        std::println("Es gibt bereits Fenster");
    win1.Draw();
}

Es gibt bereits Fenster
1 Fenster: 1. Fenster

Im Beispiel zählt die statische Eigenschaft noOfWin die Anzahl der Window-Objekte. Selbstverständlich sollte in der Praxis dieser Zähler nicht public sein. Dies dient lediglich zur Demonstration des direkten Zugriffs auf eine statische Eigenschaft.

Ein weiterer Anwendungsfall für eine statische Eigenschaft ist die Definition eines Feldes mit einer festen Größe. Soll die Feldgröße über eine Konstante bestimmt werden, ist diese Konstante als statische Eigenschaft zu definieren.

class Any
{
  static const unsigned int SIZE{10};
  int field[SIZE];
  ...
};

Statische Methoden

Statische Methoden werden eingesetzt, um statische private-Eigenschaften ohne Objektbezug bearbeiten zu können.

Um eine Methode als statische Methode zu definieren, wird bei der Deklaration bzw. Definition innerhalb der Klasse das Schlüsselwort static vor dem Returntyp der Funktion gestellt. Wird die Methode außerhalb der Klasse definiert, darf das Schlüsselwort static nicht mehr angegeben werden.

#include <print>
#include <string>
#include <string_view>

// Klassendefinition
class Window
{
    std::string title;
    // Statische Eigenschaft
    inline static unsigned short noOfWin;
public:
    // ctor
    Window(std::string_view _title): title(_title)
    {
        noOfWin++;
    }
    // dtor
    ~Window()
    {
        --noOfWin;
    }
    void Draw()
    {
        std::println("{}. Fenster: {}",noOfWin,title);
    }
    // Deklaration der statischen Methode
    static short GetNoOfWin();
};
// Definition der statischen Methode
short Window::GetNoOfWin()
{
    return noOfWin;
}

int main()
{
    Window win1("Fenster Eins");
    // Aufruf der statischen Methode
    if (Window::GetNoOfWin() != 0)
        std::println("Es gibt bereits Fenster");
    win1.Draw();
}

Es gibt bereits Fenster
1. Fenster: Fenster Eins

Statische Methoden besitzen eine Reihe von Einschränkungen:

Übungen

smem_01:

Entwerfen Sie eine Klasse zur Darstellung eines Fensters. Die Klasse soll die Eigenschaften Fenstertitel, Fensterfarbe und Farbe des Fenstertitels besitzen. Der Fenstertitel ist bei der Erstellung eines Fensters anzugeben.

Die Fenster- und Titelfarbe soll für alle Fenster gemeinsam gelten und unabhängig von einem Fensterobjekt gesetzt werden können. Verwenden Sie für die Farbeigenschaften jeweils ein unsigned long-Datum. Die Fenster- und Titelfarbe ist mit einem beliebigen Wert vorzubelegen.

Definieren Sie zwei Fensterobjekte und geben deren Eigenschaften aus. Danach ist die Fensterfarbe und die Titelfarbe zu verändern. Geben Sie die Eigenschaften der Fenster erneut aus.

Titelfarbe: 0x000000, Titel: Erstes Fenster
Fensterfarbe: 0xffffff

Titelfarbe: 0x000000, Titel: Zweites Fenster
Fensterfarbe: 0xffffff

Titelfarbe: 0x808080, Titel: Erstes Fenster
Fensterfarbe: 0x0080ff

Titelfarbe: 0x808080, Titel: Zweites Fenster
Fensterfarbe: 0x0080ff

smem_02:

Die Verwaltung eines Testfalls soll mithilfe einer entsprechenden Klasse realisiert werden. Ein Testfall besteht aus einer fortlaufenden Testfallnummer und einer Testfallbeschreibung.

Legen Sie die 3 Testfälle Feststellbremse, Betriebsbremse und Beleuchtung an und geben sie dann aus.

Tipp: Es können Objekte auch in Felder abgelegt werden!

Testfall 1: Feststellbremse
Testfall 2: Betriebsbremse
Testfall 3: Beleuchtung