Kann eine statische member-variable Aufruf nicht-statische member-Funktionen?
Sah ich den folgenden code:
http://sourcemaking.com/design_patterns/singleton/cpp/1
class GlobalClass
{
private:
int m_value;
static GlobalClass *s_instance;
GlobalClass(int v = 0)
{
m_value = v;
}
public:
int get_value()
{
return m_value;
}
void set_value(int v)
{
m_value = v;
}
static GlobalClass *instance()
{
if (!s_instance)
s_instance = new GlobalClass;
return s_instance;
}
};
GlobalClass *GlobalClass::s_instance = 0;
void foo(void)
{
GlobalClass::instance()->set_value(1); //static variable calls non-static functions
cout << "foo: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
}
Als ich weiß (bitte korrigiert mich wenn ich hier falsch),
-
Statische Funktionen können nur Zugriff(schreiben/Lesen) statische member-Variablen
-
Nicht-Statische Funktionen zugreifen kann(schreiben/Lesen) statische member-Variablen
Anhand der oben genannten Beispiel, es scheint, dass eine statische variable kann Zugriff auf nicht-statische Funktionen.
Ist das richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Variablen rufe nicht zu irgendetwas
(Das nicht wirklich-Adresse der sample-code, aber es behebt ein Missverständnis in der zwei "Regeln" aufgeführt unter dem code)
Einer statischen member-Funktion ist Mitglied und hat Zugriff auf alle public, protected und private Mitglieder der Klasse, die statische und Instanz.
Jedoch, statische member-Funktionen haben keinen
this
- Zeiger, so Zugriff auf eine Instanz-member der Instanz angegeben werden muss.den code, den Sie haben nicht ganz das, was Sie gerade gesagt haben.
Zu verstehen, was es tut, lässt wieder ein wenig und sprechen über das, was
class
wirklich bedeutet. Klassen definieren neue Typen. eine andere Art istint
. eine Instanz von int, kann sich in Funktionen lokale Variablen oder Parameter, die gespeichert werden können auf dem heap durch den Aufrufnew int
es kann global durch die Erklärung einer in der Datei scope. keiner von Ihnen weiß, oder egal, wo Sie gespeichert sind, aber Sie sind alle Instanzen des Typsint
.Wenn Sie eine Instanz einer
class
erstellen Sie den verwendeten Speicherplatz und den Verhaltensweisen auf die Instanz der Klasse, und die Verhaltensweisen, die für jede Instanz gleich.Klassen können auch etwas tun, das nicht Teil der Definition der Daten und das Verhalten Ihrer Instanzen, und diese sind die statischen member der Klasse.
Da diese Konzepte sind grundsätzlich zu trennen, die Sie eigentlich nicht gegenseitig stören. in der Tat, Sie hätte eine statische Mitglieder der Klasse beziehen sich auf eine Instanz der Klasse, und das ist genau das, was das Beispiel des singleton-Muster hat.
Also, was tatsächlich geschieht, von Anfang an ist, erstellen Sie eine Instanz der Klasse, mit
new GlobalClass
, und dann halten Sie den Mauszeiger irgendwo. Es passiert, dass der Zeiger gespeichert wird, als ein statischer member der Klasse definiert den Typ der Instanz, die Sie gerade erstellt haben.dann
GlobalClass
bietet einen Mechanismus zu verwenden, der die Instanz. beim aufrufenGlobalClass::instance()
es liest eine statische Klassenvariable, was erlaubt ist. die variable enthält einen Zeiger, die, wenn Sie aufgelöst (via->
) Ergebnisse in einem Objekt, die wir zuvor erstellt haben, und dieses Objekt, da es eine Instanz der GlobalClass, ist jetzt erlaubt Zugriff auf eine Instanz-variable.foo
Funktion ist der Aufruf nicht-statische member-Funktionen, die eine Instanz. Es ist eine Instanz, kam es vonGlobalClass::instance()
. Darüber hinausGlobalClass::instance()
nicht zurücks_instance
ist, wird eine Kopie (eine Kopie eines Zeigers auf die ein Zeiger zeigt auf die selbe Adresse).static
auf die Methodeinstance()
bedeutet, dass Sie nicht brauchen eine Instanz vonGlobalClass
um es aufzurufen. Der Modifikatorstatic
aufs_instance
bedeutet, es gibt nur 1 davon, und alle Instanzen teilen Sie es.static
beschreibt hier, wie die Klasse verwendet, die es. Aber am Ende des Tages, ist es immer noch eine Instanz der Klasse selbst. Und Instanzen, die Zugriff auf statische und nicht-statische Methoden.public
/protected
/private
).instance
wie der name schon andeutet, gibt einen Zeiger auf eine Instanz. Es verwendet auch eine statische Instanz-Zeiger-Felds_instance
. Die Tatsache, dass dies statisch bedeutet, dass es nur eines_instance
Feld pro Klasse. Sobald man die Instanz-Zeiger (voninstance
), können Sie es verwenden, wie jede andere Instanz-Zeiger. Die Fakten, die Sie bekam es über eine statische Methode und die Methode verwendet eine statische Feld, sind irrelevant.Die statische Methode selbst gültig ist; es nicht
this
implizit oder explizit.s_instance
selbst ist statisch, nicht nur die Methode, durch die er den Zeiger.Den technischen Themen schon gepostet wurden in anderen Antworten, ich werde nur hinzufügen, ein Beispiel versuchen zu helfen, die Verwirrung. Vorstellen, dass Sie eine Klasse erstellen die Menschliche zu stellen, den ein Mensch haben kann, Eigenschaften wie die Farbe der Augen, der name und so... und-Methoden, definieren die Aktionen wie gehen, springen,... die Eigenschaften und Methoden der einzelnen Instanz von Menschen: einem bestimmten Menschen vielleicht Blaue Augen haben, und Sie können Sie bitten, zu sprechen.
In einer anderen Ebene, es könnte sein, Eigenschaften oder Handlungen, die nicht besonders an die Instanz sondern zu der ganzen Klasse von Menschen, wie die, wer der größte oder der älteste Mensch. Diese sind deklariert statische, wie die Zugehörigkeit zu der Gesamtheit der Menschen, sondern eher als an den einzelnen.
Nun, wenn Sie erhalten eine individuelle, aus der Klasse, sagen wir das höchste, das Individuum ist ein Mensch, und als solche können Sie bitten, eine Eigenschaft, die Sie wollen, oder Sie können verlangen, jede Aktion, die Sie brauchen:
Human::get_tallest().get_something_from_cupboard()
Anfrage der höchste (get_tallest()
) Menschen in der Gruppe (Klasse Aktion) und dann verlangen, dass bestimmten Person eine Aktion durchführen, die für Sie (get_something_from_cupboard()
), die eine Aktion durchgeführt, die von einem bestimmten Instanz.