static

Es gibt viele Anwendungen und Bedeutungen für das Schlüsselwort static. In diesem Beispiel wird nur die Bedeutung des Schlüsselwortes für Methoden und Attribute erläutert. Abgesehen davon muss ich wieder einmal auf die Ressourcen im Internet verwiesen.

Static bedeutet in den meisten Zusammenhängen: Von dieser Variable oder Funktion (von diesem Attribut oder dieser Methode) gibt es nur eine Ausführung.

CCount

Wäre es nicht schön, wenn eine Klasse wüsste, wieviele Instanzen von ihr existieren? Das lässt sich mit Hilfe statischer Attribute und Funktionen programmieren:

// Klasse, die speichert, wieviele Instanzen
// von ihr existieren
class CCount
{
  public:

    // Konstruktor: Anzahl um eins erhöhen
    CCount()
    { m_instances++; }

    //Destruktor: Anzahl um eins verringern
    virtual ~CCount()
    {
        m_instances--;
        if (m_instances == 0)
            cout << "CCount sauber aufgeraeumt" << endl;
    }

    // Gebe Anzahl der Instanzen zurück
    static unsigned int instances()
    { return m_instances; }

  protected:

    // Anzahl erzeugter Objekte dieser Klasse
    static unsigned int m_instances;
};

// Statische Elemente ein Mal initialisieren
unsigned int CCount::m_instances = 0;

Das zentrale Element der Klasse ist die Anzahl der erzeugten Objekte, das im statischen Attribut m_instances gespeichert ist. Statische Attribute müssen irgendwo initialisiert werden. Hier folgt die Initialisierung einfach im Anschluss an die Klassendeklaration. Normalerweise geschieht dies aber in der C++-Datei der Klasse.

Sonst passiert in der Klasse nicht viel. Beim Erzeugen eines Objekts wird m_instances um eins erhöht, im Destruktor um eins erniedrigt. Wenn kein Objekt der Klasse mehr existiert, gibt der Destruktor noch einen kleinen Text aus.

Über die statische Methode instances kann abgefragt werden, wieviele Elemente der Klasse existieren. Statische Funktionen sind nicht an Objekte gebunden, d.h. sie können unabhängig von den Objekten über die Notation Klasse::Methode() angesprochen werden. Das bedeutet aber auch, dass wir innerhalb einer statischen Funktion keinen Zugriff auf Attribute oder Funktionen des Objekts haben, die nicht-statisch sind, also zu einzelnen Objekten gehören.

CSingleton

Das Beispiel enthält noch eine Klasse, die das Singleton Entwurfsmuster (teilweise) implementiert. Ein Singleton ist ein Objekt, von dem es während das Programm läuft nur eine Instanz gibt, auf die alle zugreifen.

Im Beispiel wird dies durch ein Objekt gelöst, dessen Konstruktion und Destruktion geschützt sind. Das Objekt kann also nicht einfach so erzeugt oder gelöscht werden. Hierfür gibt es die beiden öffentlichen Methoden getSingleton und releaseSingleton.

Die Methode getSingleton liefert einen Zeiger auf das einzig existierende Objekt zurück. Wenn noch kein solches Objekt existiert, wird es von der Methode erzeugt (der Konstruktor ist geschützt, also innerhalb der öffentlichen getSingleton-Methode aufrufbar). Ähnlich wie in der Klasse CCount hält die Klasse CSingleton nach, wie viele Referenzen auf das Objekt existieren.

In der Methode releaseSingleton wird die Anzahl der Referenzen wieder heruntergezählt. Gibt es keine Referenzen mehr, wird das einzig existierende Objekt gelöscht... Hier ist etwas Vorsicht geboten. Wird das einzige Objekt gelöscht, dann auch die in diesem Objekt gespeicherten Werte (m_value). Wir verlieren also die Persistenz der Werte des Objekts.

Das Singleton enthält auch noch eine statische Konstante, s.h. sie existiert ein Mal für alle Objekte bzw. ein Mal im gesamten Programm.

main

Die main-Funktion sollte euch inzwischen keine größeren Probleme mehr bereiten.

Selbständige Programmierung
  • Programmiere das Programm so um, dass es keine Probleme mehr mit der Persistenz, zumindes in der main-Funktion, gibt. Was ist das Problem beim Beenden des Programms? Wird alles sauber initialisiert und aufgeräumt?

zurück