Rufen Sie eine nicht statische Member-Methode von einer anderen Methode auf

8

Gibt es eine Möglichkeit, eine nicht statische Klassenmembermethode von einer anderen Methode aufzurufen, die in der Hauptklasse in C ++ enthalten ist? Wenn ja, wie würde der Code aussehen?

Problem ist, ich kann diese spezifische Methode nicht als statisch deklarieren, weil sie andere Methoden innerhalb derselben Klasse verwendet, die dann nicht funktionieren, wenn ich die eine statische mache.

Ich versuche zu verwenden:

%Vor%

von einer Methode innerhalb der Hauptklasse, aber es gibt mir den Fehler: eine nicht statische Mitgliedsreferenz muss relativ zu einem bestimmten Objekt sein.

Um zu verdeutlichen, verwendet myClassMethod () andere Methoden in MyClass wie:

%Vor%

Wenn ich also myClassMethod static machen würde, würde dies den Aufruf von anotherClassMethod () stören.

    
aclark 15.03.2012, 03:03
quelle

4 Antworten

4

Eine statische Methode ist eine Methode, die nicht auf einem bestimmten Objekt ausgeführt wird. Es ist einer eigenständigen Funktion außerhalb einer Klasse sehr ähnlich, außer dass es erlaubt ist, auf private Mitglieder in seiner Klasse zuzugreifen.

Wenn anotherClassMethod() nicht statisch ist, bedeutet das, dass es für ein bestimmtes Objekt, eine Instanz der Klasse, aufgerufen werden muss. Da es für ein Objekt aufgerufen wird, kann es auf Daten zugreifen, die in diesem Objekt gespeichert sind (nicht statische Elementvariablen). Wenn myClassMethod() statisch ist und Sie es als

implementieren %Vor%

Das wird nicht funktionieren, weil anotherClassMethod() erwartet, dass es für ein bestimmtes Objekt aufgerufen wird, aber myClassMethod() hat keins. Aber wenn Sie wissen, welches Objekt Sie aufrufen möchten, können Sie es als gewöhnlichen Methodenaufruf für ein Objekt verwenden:

%Vor%

Das object muss nicht als Argument übergeben werden; Es könnte eine statische Membervariable in der Klasse sein, zum Beispiel:

%Vor%

Letztendlich müssen Sie sich folgende Frage stellen: Warum ist myClassMethod() statisch und warum ist anotherClassMethod() nicht statisch? Mach einen Schritt zurück und denke darüber nach, was myClassMethod() tun soll. Ist es sinnvoll, es aufzurufen, wenn Sie keine Instanz haben, mit der Sie arbeiten können? Wenn ja, warum muss eine Methode aufgerufen werden, die mit einer Instanz arbeiten soll?

    
Wyzard 15.03.2012 03:26
quelle
3

Die einzige Möglichkeit, eine nicht statische Methode einer Klasse aufzurufen, ist eine Instanz dieser Klasse. Du brauchst so etwas ...

%Vor%     
Lou 15.03.2012 03:08
quelle
3

Was ist mit dem Aufruf der nicht statischen Elementfunktion von einer static -Memberfunktion?

Jede nicht statische Memberfunktion wird implizit zusätzlich zu den übergebenen Parametern ein this -Zeiger übergeben. Der übergebene Zeiger wird dann dereferenziert, um Member von Klassenobjekten zu verweisen. static -Funktionen werden jedoch nicht mit dem impliziten this -Zeiger übergeben und daher kann man keine nicht statische Elementfunktion in einer statischen Elementfunktion aufrufen, da hierfür kein this vorhanden ist.

Was ist die Lösung, wenn Sie es trotzdem tun möchten?

Sie benötigen einen Mechanismus, um den Zeiger auf das Objekt innerhalb der statischen Methode zu erhalten, und dann können Sie die Elementfunktion mit diesem Zeiger aufrufen.
Wie geht das?
Sie müssen den Zeiger auf das Klassenobjekt global speichern oder es als Instanz in einem der Funktionsargumente an die statische Methode übergeben.

Bei beiden oben genannten Methoden handelt es sich jedoch um Problemumgehungen. Wichtig ist, dass Sie Folgendes beachten: Wenn Sie das Bedürfnis haben, eine nicht statische Elementfunktion über eine statische Elementfunktion aufzurufen, liegt ein Fehler in Ihrem Entwurf vor.

Auf den zweiten Gedanken vielleicht habe ich Ihre Frage falsch gelesen, wahrscheinlich, Ihre Frage ist:

So rufen Sie eine nicht statische Elementfunktion einer Klasse aus main ?

auf

Sie benötigen eine Instanz der Klasse, um nicht statische Elementfunktionen aufzurufen.
So einfach,

%Vor%

Und jede andere Mitgliedsfunktion innerhalb von myClassMethod() aufzurufen wäre einfach:

%Vor%     
Alok Save 15.03.2012 03:05
quelle
0

Ich denke, dass Sie vielleicht das Singleton-Muster verwenden könnten, um eine Instanz der Klasse global zu behalten. wie eine Dienstprogrammklasse.

    
wangdxh 15.03.2012 03:29
quelle

Tags und Links