static Variablen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

static Variablen

Beitrag von Illuminatus »

hi habe ich das richtig verstanden?
wenn ich eine klasse habe

Code: Alles auswählen

class soundso{

private:
   static int statischeVariable;

}
und dann mehrere instanzen dieser klasse bilde, dann haben alle instanzen dieser klasse denselben wert der statischen Variablen? das heißt änder ich den wert der variablen in einer instanz ist sie für alle instanzen geändert?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

static-Variablen sind unabhängig von jeder Klasseninstanz. SIe existiern auch wenn keine Instanz der Klasse existiert, und zwar genau einmal.
Demnach ändert sich die Variable nicht in jeder Instanz, man kann ihn auch nicht für eine Instanz ändern.
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

wie habe ich dann zugriff darauf ohne instanz?

kann man dann auch methoden wie in java static setzen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du bist hier seit 3 Monaten registriert, und hast es scheinbar immer noch nicht geschafft, dir ein Buch über C++ zu Gemüte zu führen.
So Sachen wie static-Member und Methoden sollten eigentlich überall gut erklärt werden. Z.B. hier. Das erste Google-Ergebnis auf der Suche nach C++ static.
CLRS530
Beiträge: 155
Registriert: 8. Oktober 2007 18:00

Beitrag von CLRS530 »

Ich muss dir da wiedersprechen. Die Sache mit static wird meiner Meinung so gut wie nirgends wirklich erklärt. Zumindestens für den eigentlichen Einsatz unzureichend/unverständlich, aber das mag natürlich auch an der Limitation meiner eigenen Person liegen :lol:.
Wo ich es das erste Mal verwendet habe, musste ich, bis ich es verstanden habe auch einige Quellen durchlesen.
Also werde ich dir hier einmal helfen.

Hast du Beispielsweise in dem Header einer Klasse folgendes:

Code: Alles auswählen

private:
static QVector<FormatInfos> formats;
Musst du am Anfang der Implementation noch die eigentliche Instanz bilden, da Statics sonst nur definiert sind.

cpp Anfang:

Code: Alles auswählen

QVector<FormatInfos> SevenZipLibrary::formats;

QVector<FormatInfos> *MyLibrary:getFormatInfos()
{
    return &formats;
}
Willst du diese Static Klasse nun benutzen, kannst du in jedem beliebigen Modul folgendes machen

Code: Alles auswählen

#include "mylibrary.h"

QVector<FormatInfos> = MyLibrary::getFormatInfos();
Das schließt natürlich ein, dass du von dort auch auf die Variable schreiben kannst. Aufpassen musst du nur, wenn du Multithreadet Anwendungen schreibst, dann darf der Zugriff nur einmal erlaubt werden.

Ich hoffe das war Verständlich.
graythornWW
Beiträge: 38
Registriert: 20. Oktober 2008 09:48

Beitrag von graythornWW »

Nur als Anregung und Ausblick:
Das schließt natürlich ein, dass du von dort auch auf die Variable schreiben kannst. Aufpassen musst du nur, wenn du Multithreadet Anwendungen schreibst, dann darf der Zugriff nur einmal erlaubt werden.
statics sollten meiner bescheidenen Meinung nach weitgehend vermieden werden, insbesondere in multithreading Applikationen. Sie sind - insbesondere wenn sie nicht private sind - recht fehleranfällig und blöd zu debuggen.

Eine sehr viel schönere Lösung stellt in vielen Fällen das Singleton-Pattern dar. Das hier zu erklären sprengt den Rahmen, aber ich empfehle nachdrücklich entsprechende Literatur über Pattern-Programmierung zu lesen :-)
Antworten