Statische Variablen in überladenen Funktionen
-
27-09-2019 - |
Frage
Ich habe eine Funktion, die die folgende tut:
- Wenn die Funktion aufgerufen wird und einen echten Bool Wert übergeben, setzt er einen statischen Bool Wert auf true
- Wenn die Funktion aufgerufen wird, und übergeben eine Zeichenfolge, wenn der statische Bool Wert auf true gesetzt ist, wird es etwas tun mit dieser Zeichenfolge
Hier ist meine Sorge - wird eine statische Variable gleich zwischen zwei überladenen Funktionen bleiben? Wenn nicht, kann ich einfach eine eigene Funktion erstellen entworfen Spur des Bool Wert zu halten, aber ich versuche, die Dinge einfach zu halten.
Lösung
Nein, erstellt es zwei separate statische Variablen - eine für jede Funktion. Der Name einer C ++ Funktion op seine scheinbaren Namen und ihre Parametertypen hergestellt, und der Name der statisch ist (wenigstens konzeptionell) geheftet zu dem. Anstatt Add noch eine andere Funktion, können Sie die Variable statisch in Bezug auf die Klasse in Erwägung ziehen, die Funktionen enthalten, obwohl dies nicht, dass Sie genau das gleiche Verhalten nicht geben, oder es in einem anonymen Namespace platzieren:
namespace {
int myvar = 0;
}
int f( bool b ) {
return myvar;
}
int f( const string & s ) {
return myvar;
}
Um die Funktionen Mitglieder einer Klasse zu machen:
// a.h
class A {
public:
static int f( bool b ) {
return myvar;
}
static int f( const string & s ) {
return myvar;
}
private:
static int myvar;
};
// a.cpp
int A::myvar = 0;
// main.cpp
#include <iostream>
#include <a.h>
int main() {
std::cout << A::f(false) << A::f( string("foobar") ) << std::endl;
}
Andere Tipps
Zwei überladene Funktionen sind zwei verschiedene Funktionen. Auch wenn jede Funktion eine static bool
mit der gleichen Kennung enthält, gehören sie in verschiedenen Bereichen und die Kennung bezieht sich auf eine eindeutige Variable in jeder Funktion.
Wenn Sie Aktien Zustand müssen zwischen zwei Funktionen, die Sie sind wahrscheinlich besser dran, eine Klasse zu machen, diesen Zustand zu kapseln und machen die beiden Funktionen Elementfunktionen dieser Klasse.
Die Antwort ist nein. Es gibt keinen Grund es sein sollte, denn nach allem, was wir über zwei Funktionen sprechen.
Da ist es schon gezeigt worden, ich möchte den Kern der Sache befassen. static
stellt static
globalen Zustand und globaler Zustand ist schlecht. Es führt zu subtilen Fehler, Schwierigkeiten Test richtig (da ein Test diejenigen, nachdem sie ausgeführt beeinflusst) und denken Sie nicht einmal über es multithreaded going ...
Deshalb würde ich wirklich fordert Sie dazu auf die static
ganz zu vermeiden. Sie würden dann zwei Lösungen:
- Erstellen Sie eine Klasse mit den beiden Überlastungen wie Methoden und speichern Zustand (nicht statisch, bitte)
- Führen Sie den Bool als Parameter an die Methoden, out-Parameter für die Bool Überlastung und in-Parameter für die Zeichenfolge Überlastung
Pick-up je nachdem, was einfacher ist, zu erreichen.