Statische Memberfunktionsvariablen: Gängige Praxis oder nicht?
-
Hallo zusammen,
da hier zur Zeit ziemlich über Coderichtlinen und solche Sachen diskutiert wird, wollte ich euch mal über eure Meinungen zu statischen Memberfunktionsvariablen fragen.
Angenommen ich habe einen zyklischen Callback der von einem Timer immer wieder aufgerufen wird und ich hab Code der in der Funktion nur einmal aufgerufen werden soll.
Dann könnte man ja generell folgendes machen.
void SomeClass::Callback() { static bool firstCall = true; if(firstCall) { // mach was ... firstCall = false; } // mach zyklische Sachen ... }- Seht ihr in so einem Ansatz Probleme die mir gerade nicht auffallen?
- Sollte man für so etwas Membervariablen nehmen, obwohl mich die Entscheidung nur in dieser Funktion interessiert?
Danke fürs Antworten...
Greets
Tobi
-
1. Multi Threading kann zum Thema werden
2. Die funktionslokale statische Variabe ist bei allen SomeClass Instanzen gemeinsam - ich hoffe, das ist das was benötigt wird
-
Sollte man für so etwas Membervariablen nehmen, obwohl mich die Entscheidung nur in dieser Funktion interessiert?
Ganz einfach, Deine Beschraenkung auf "nur einmal" ausführen, trifft die auf eine Instanz, oder Global auf die Klasse zu ?
Bei Deiner Ausfuehrung iss das irgendwie gemischt, also weder Fisch noch Fleisch.
Also kann es von SomeClass mehrere Instanzen geben und diese "initialisierung" muss fuer jede Instanz laufen -> Member, ganz klar
Soll es von SomeClass immer nur eine Instanz geben -> auch member und die Instanzen absichern, das es immer nur eine gibt (Singleton). Dann wird Deine Funktion logisch auch nur einmal aufgerufen.
statische membervariablen hängen haeufig mit statischen memberfunktionen zusammen.
Ciao ...
-
Danke euch beiden für die Antworten.
SomeClass ist nur einmal instanziert und dass wird auch so bleiben. Dass heißt
theta schrieb:
...
2. Die funktionslokale statische Variabe ist bei allen SomeClass Instanzen gemeinsam - ich hoffe, das ist das was benötigt wird
trifft zu.
Die Absicherung für Multithreading hab ich im Beispielcode nicht eingebaut, das Thema ist mir aber durchaus bewusst.
RHBaum schrieb:
...
Dann wird Deine Funktion logisch auch nur einmal aufgerufen. ...Die Funktion selbst wird zyklisch aufgerufen, und dass soll/muss auch so bleiben, nur der eine Teil, darf nur einmal aufgerufen werden...
-
Tobias Gerg schrieb:
Dann könnte man ja generell folgendes machen.
void SomeClass::Callback() { static bool firstCall = true; if(firstCall) { // mach was ... firstCall = false; } // mach zyklische Sachen ... }Ich würds vermutlich eher so machen (Multithreading-Sicherheiten fehlen da noch):
bool CallbackFirstCall() { // mach was ... return false; } void SomeClass::Callback() { static bool firstCall = CallbackFirstCall; // mach zyklische Sachen ... }Das spart das if, das ja sowieso (fast) immer nicht zieht.
-
pumuckl schrieb:
...
Ich würds vermutlich eher so machen (Multithreading-Sicherheiten fehlen da noch):
bool CallbackFirstCall() { // mach was ... return false; } void SomeClass::Callback() { static bool firstCall = CallbackFirstCall; // mach zyklische Sachen ... }Das spart das if, das ja sowieso (fast) immer nicht zieht.

Danke für den Tipp pumuckl, das ist eine schöne Idee, die mir gefällt..
Greets
Tobi