C++ - Überladung der Statischen Funktion mit Nicht-Statische Funktion
Ich würde gerne drucken zwei unterschiedliche Dinge, je nachdem, ob eine Funktion aufgerufen wird, statisch mit Foo::print()
oder von einer Instanz von Foo foo; foo.print();
EDIT: Hier ist eine Klassendefinition, die funktioniert definitiv nicht, da beantwortet ein paar Menschen schon.
class Foo {
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
Jedoch, ist es eine gute Möglichkeit, dies zu erreichen Wirkung? Grundsätzlich würde ich gerne machen:
if(this is a static call)
do one thing
else
do another thing
Formuliert in einer anderen Art, ich weiß, PHP überprüfen können, ob der *this
variable definiert ist oder nicht, um festzustellen, ob die Funktion aufgerufen wird, statisch. Funktioniert der C++ haben die gleiche Fähigkeit?
Warum nicht probieren Sie es und sehen,?
beide Versionen von
beide Versionen von
print()
trägt die gleiche Signatur. Und ich glaube nicht, dass Sie überlastet werden kann diese Weise.InformationsquelleAutor Alan Turing | 2011-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, ist es direkt verboten, durch die der standard:
Außerdem wäre es sowieso mehrdeutig, da es möglich Aufruf von statischen Funktionen der Instanzen:
So würde es Unklarheiten mit dem, was Sie haben:
Adresse deiner Frage, ob Sie überprüfen können, welche Instanz einer member-Funktion aufgerufen wird, gibt es die
this
Schlüsselwort. Diethis
Schlüsselwort this auf das Objekt, für das die Funktion aufgerufen wurde. Jedoch, diethis
Stichwort ist immer auf ein Objekt, d.h. es wird nieNULL
. Daher ist es nicht möglich zu überprüfen, ob eine Funktion aufgerufen wird, statisch oder nicht à la PHP.Fridman: ich glaube nicht, Sie fragte nur schlecht. Sie fragte "Hat C++ haben die gleiche Fähigkeit?" und ich antwortete, dass man nicht basierend auf der C++ - standard (bestimmt - die Sprache).
Ich fühle mich schlechter und schlechter über meine Formulierung der Frage, die vor allem der Titel. Es gibt eigentlich zwei Fragen. Zuerst wenn Sie überladen wird statisch mit nicht-statischen. Das ist, was Sie antwortete, sehr gut. Die zweite Frage ist, wenn Sie ermitteln können ob es eine Instanz der Klasse zugeordnet, der Aufruf der statischen Funktion. Wie Sie gesagt haben, Sie können eine statische Funktion wie diese:
Foo foo; foo.print();
Kann ich auf diefoo
Instanz vom rufen, umprint();
?Fridman: Ah, okay. Sie haben klargestellt, es für mich also keine sorgen über Ihre Phrasierung. Ich werde Antworten, dass ein Teil.
InformationsquelleAutor In silico
Es ist definitiv nicht erlaubt. Ich sehe keine saubere Möglichkeit, dies zu erreichen. Was ist genau das problem, das Sie lösen wollen, auf diese Weise?
Sie scheinen Missverständnis, was 'static' bedeutet. Sie nicht Zugriff auf nicht-statische Variablen in einem static-Methode; Sie sind nicht um eine Instanziierung der Klasse. Der einzige Weg, dies zu tun wäre, um eine Instanziierung der Klasse, die die statische Methode.
Ich kenne Brian, aber Sie können rufen Sie statische Mitglieder "nicht-statisch", also statt
Foo::print();
verwendenFoo foo; foo.print();
Sie sind sich nicht aufrufen es "nicht statisch" ... das ist immer noch ruft die gleiche statische Funktion in der Klasse, und hat nichts zu tun mit der Instanz der Klasse, die Sie zufällig da haben. Es ist nicht anders als
Foo::print();
Finden Sie unter: stackoverflow.com/questions/325555/... - ich glaube, das ist die Quelle deiner Verwirrung ist.Ah okay, also die Instanz von
foo
in diesem Fall hat keine Bedeutung und kann nicht zugegriffen werden innerhalbprint()
. Vielen Dank für diese Klarstellung BrianInformationsquelleAutor Janick Bernet
Können Sie nicht tun, genau, siehe In-silico-Antwort.
Aber Sie können
Foo::print()
undFoo foo; print(foo);
verschiedene Dinge tun. (Definevoid print(Foo& foo)
im gleichen namespace wieclass Foo
es wird gefunden werden, indem ADL).In jedem Fall, dies ist nicht eine gute Idee. Sie haben zwei Funktionen, die sehr ähnlich im Namen, die völlig verschiedene Dinge, die gegen das gute design-Prinzipien.
Die beiden Funktionen werden verschiedene Dinge tun, so dass sicherlich einer von Ihnen kann einen anderen Namen haben. Vielleicht
Foo::PrintLiveFooCount();
undFoo foo; foo.print();
?InformationsquelleAutor Ben Voigt
Die Antwort ist Nein, denn Sie können nicht überladen, basierend auf eine Rückkehr geben.
Können Sie sicherlich haben statische Methoden in einer Klasse, aber Sie nicht haben können:
Da Sie die gleiche Signatur der Methode.
EDIT: ich sah Ihren Kommentar zu sagen, warum Sie wollte, dies zu tun, und Sie wollte Zugriff auf member-Variablen. Sie würde dies tun müssen:
(Oder erstellen Sie Getter und setter in Foo usw, aber das ist die Allgemeine Idee)
Foo::print(f)
überf.print()
.InformationsquelleAutor Brian Roach