2016-05-17 6 views
3

eindeutig etwas zu tun, wie static void DoSomething(ClassPointer* MyPtr = this) würde nicht funktionieren, weil eine statische Methode keine this hat, aber wenn ich rufe diese DoSomething ich immer das Bestehen die this von der Wenn ich es anrufe, würde ich es nicht jedes Mal neu schreiben müssen.(C++) Pass ‚dieses‘ zu einer statischen Methode als Standardparameter

Wenn es eine Möglichkeit gäbe, einen Verweis auf die Klasse zu bekommen, die diese statische Methode aus der Methode heraus aufruft, dann würde das funktionieren, aber AFAIK gibt es nicht.

Welche Optionen habe ich zur Verfügung?

+0

Sie ein Makro –

+8

verwenden könnte Wenn Sie sich immer ‚dies‘ vorbei, warum ist es eine statische Member-Funktion? –

+6

Wenn Sie die statische Methode immer mit einer Instanz aufrufen, warum sollten Sie sie nur als nicht statische Methode verwenden? – songyuanyao

Antwort

1

ein Makro

#define DoSomethingX(...) DoSomething(this, __VA_ARGS__) 

Und rufen

StaticFunctionClass::DoSomethingX(par1, par2); 
1

Wenn der Kontext des anfordernden Objekts als Referenz übergeben werden soll, würde ich die Methode als nicht statische Instanzmethode betrachten. Auf diese Weise können Sie innerhalb der Methode auf die anderen Instanzmitglieder der Klasse verweisen. Wenn sich das Verhalten abhängig von der Unterklassenklasse ändert, könnten Sie möglicherweise eine virtuelle Methode verwenden, die überschrieben werden kann. Schreiben

+0

Ich denke, er meint, dass er viele verschiedene Klassen hat, die alle diese statische Methode aufrufen (wie vielleicht registriert es einen Callback-Listener) Die Klasse, in der sich die statische Methode befindet, befindet sich nicht in derselben Vererbungshierarchie wie die Aufrufer. Daher müssen Sie den Zeiger an die Klasse des Aufrufers übergeben, damit der übergebene Zeiger später zum Aufruf einer Memberfunktion im Aufrufer verwendet werden kann class Wenn es eine Memberfunktion wäre, müsste sie in jeder Vererbungshierarchie und nicht nur in der eventListener-Klasse enthalten sein. Gibt es eine Möglichkeit, das zu tun? –

+0

Interessant.Nun, C++ unterstützt mehrfache Vererbung, so dass Sie tatsächlich eine Basisimplementierung haben könnten, die von jeder Klasse erweitert werden könnte, oder? Ich mag Ihre Idee über einen Callback-Ansatz. Könnte auch das Besuchermuster https://en.wikipedia.org/wiki/Visitor_pattern berücksichtigen –

Verwandte Themen