2010-12-29 11 views
8

da ist etwas, das mich nervt.Statische lokale Variablen in Methoden eine schlechte Praxis?

In einem non-threaded-Programm, ist es besser, lokale statische Variablen (interne Methoden) oder statische Klassenmitglieder zu haben?

In diesem Beispiel:

class C{ 
public: 
    C(){}; 
    void foo(); 
}; 

void C::foo(){ 
    static int bar = 0; 
    bar++; 
    printf("%d\n",bar); 
} 

Ist es eine schlechte Praxis betrachtet, wenn bar wird in C::foo() allein verwendet werden?

Antwort

7

Weder ist besser. Sie dienen sehr unterschiedlichen Anwendungsfällen.

+4

Der Anfang Ihrer Antwort klingt vielversprechend, aber könnten Sie das ausarbeiten? –

+12

@IIyan, die Semantik in seinem Code ist "print wie oft 'foo' wurde aufgerufen!". Nach dem, was man in seiner Frage sehen kann, hat dies nichts mit dem Zustand der Klasse zu tun, und so wäre es schlicht falsch, die Variable als statisches Klassenmitglied zu verwenden. Wenn jedoch "foo" ein Kopierkonstruktor wäre und "bar" würde "numberOfCopies" heißen, wäre es ein guter Kandidat für ein statisches Klassenmitglied.Es kommt darauf an, wie es benutzt wird. –

0

Objektorientiert sprechen, bar ist Teil des Zustand der Klasse C. Dies ist der Grund, warum ich normalerweise lieber Felder als statische lokale Variablen verwenden.

+0

Zustand welches Objekts? Globale Variablen (Statik in diesem Beispiel) gehören nicht zum Status eines Objekts, sie sind Teil des globalen Status. –

+0

Danke, @Gene. Ich habe die Antwort bearbeitet. –

+0

Nein ist es nicht. Nur nicht statische Member können als "Status" eines Objekts dienen. –

2

Wenn es eine öffentliche Klasse ist, erfordert ein statisches Klassenmitglied die Bearbeitung der Header-Datei. Dies ist nicht immer wünschenswert.

Eine weitere Option ist eine Dateibereichsvariable in einem anonymen Namespace. Dies ist ausreichend, wenn Sie Zugriff nur in einer Methode benötigen, und wenn Sie es in mehreren benötigen.

0

Sowohl lokale als auch nicht lokale globale Variablen sind "schlecht", da sie global sind. Die Initialisierung und der Zugriff für diese beiden Fälle sind jedoch unterschiedlich. Daher hängt die Antwort, die Sie verwenden, von Ihren Anforderungen in Bezug auf diese Anforderungen ab.

Als eine Nebenbemerkung ist die dynamische Initialisierung von lokalen Variablen mit statischer Speicherdauer möglicherweise threadsicher, abhängig von Ihrem Compiler. Die gute Nachricht, in C++ 0x ist es garantiert Thread-sicher.

+0

Es ist falsch mit globalen Variablen. Das Problem liegt in einem global zugänglichen veränderbaren Zustand. Beides trifft hier nicht zu. –

4

Ich versuche normalerweise, den Umfang der Variablen so weit wie möglich zu begrenzen, solange es nicht seltsam oder langweilig wird.

Wenn Sie 1000 Zeilen Code in class C haben, von denen 100 Zeilen Code in der Funktion foo, jede Änderung, die Sie bar tun (zum Beispiel den Namen oder die Art zu ändern) erfordert mehr als 100 Zeilen Code gehen zu machen sicher, dass die Änderung in Ordnung ist. Wenn Sie bar ein statisches Klassenmitglied haben, müssen Sie möglicherweise über 1000 Zeilen Code gehen, nur um sicherzustellen, dass bar dort nicht verwendet wird. Das wäre Zeitverschwendung.

Wenn Sie denken, Sie bar in einer anderen Funktion benötigen könnten foo2 (zum Beispiel, wenn für foo und foo2 zusammen Anruf counting), möchten Sie vielleicht bar ein statisches Klassenmitglied machen.

+0

+1 Das Minimieren des "statischen" Variablenbereichs ist wichtig. Global vs. CPP-Modul versus Klasse vs. Methode/Funktion vs. verschachtelte {} -Block. Ich bevorzuge die Verwendung statischer Daten auf der .cpp-Modul-Ebene, da sie in einer Klassendeklaration enthalten sind, da Clients dann, wenn Sie sie in den Klassenheader einfügen, von einem Implementierungsdetail abhängig sind. – franji1

Verwandte Themen