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