Private Member-Funktion, die einen Zeiger auf ein privates Mitglied in der gleichen Klasse nimmt
-
19-09-2019 - |
Frage
Wie kann ich das tun? (Der folgende Code nicht funktioniert, aber ich hoffe, dass es die Idee erklärt.)
class MyClass
{
....
private:
int ToBeCalled(int a, char* b);
typedef (MyClass::*FuncSig)(int a, char* b);
int Caller(FuncSig *func, char* some_string);
}
Ich möchte Anrufer in irgendeiner Weise nennen wie:
Caller(ToBeCalled, "stuff")
und haben Caller
Anruf ToBeCalled
mit dem, was es fühlt sich Parameter vorbei Bedürfnisse. Wenn möglich möchte ich alles im privaten Teil meiner Klasse gekapselt halten. In Wirklichkeit würde ich über 50 Funktionen wie ToBeCalled
habe, so kann ich nicht einen Weg, dies zu vermeiden sehen.
Vielen Dank für alle Vorschläge. :)
Lösung
Sie sind die meisten der Weg dorthin. Sie sind den Rückgabetyp aus dem typedef fehlt, sollte es sein
typedef int (MyClass::*FuncSig)(int, char*);
Nun müssen Sie nur um es richtig verwenden:
int Caller(FuncSig func, int a, char* some_string)
{
return (this->*func)(a, some_string);
}
Sie wollen um Ebene FuncSig
Instanzen passieren, nicht FuncSig*
- ein FuncSig*
ein Zeiger auf einen Zeiger auf eine Elementfunktion ist, mit einer zusätzlichen unnötigen Zwischenstufe. Dann verwenden Sie den Pfeil-Sterne-Operator (nicht der offizielle Name) zu nennen:
(object_to_be_called_on ->* func)(args);
Für Nicht-Zeiger-Objekte (zum Beispiel Objekte auf dem Stapel, oder Verweise auf Objekte), verwenden Sie den Punkt-Sternoperator:
MyClass x;
(x .* func)(args);
Auch sein, den Operator Vorrang vorsichtig - die Pfeil-Sterne und Punkt-Sterne-Betreiber haben niedrigere Priorität als Funktionsaufrufe, so müssen Sie in den zusätzlichen Klammern setzen, wie ich oben getan habe
.Andere Tipps
Ich nehme an, Sie versucht Caller(MyClass::ToBeCalled, "stuff")
schon, aber gibt es einen besonderen Grund Sie einen Funktionszeiger benötigen? Außerdem geben bitte die aktuellen Compiler-Fehler.