Methoden als globale Funktionszeiger. Wie eleganter?
-
Ich möchte Klassen Methoden welche globale Funktionszeiger sind. So dass ich diese beim initalisieren meiner Anwendung setzen kann.
Ich habe schon eine Lösung. Würde jedoch gerne etwas eleganteres haben. Z.B. etwas was die VTables benutzt.
Von außen soll es nur einen Klassentypen sein.
Hier mein momentaner code:
class myClass { public: static void initFunctionPointer() { //here we could chose different function pointers myDynamicFunction_STATIC_POINTER = &myDynamicFunction_UN_STATIC_FUNCTION1; } inline void myDynamicFunction(int var){myDynamicFunction_STATIC_POINTER(*this, var);} private: int internVar; static void (*myDynamicFunction_STATIC_POINTER)(myClass &classObj, int var); static void myDynamicFunction_UN_STATIC_FUNCTION1(myClass &classObj, int var) { classObj.internVar = var; } };
-
Hört sich mach dem strategy desing pattern an.
-
Osbios schrieb:
Ich möchte Klassen Methoden welche globale Funktionszeiger sind.
Ich verstehe nicht genau was du tun willst. Mit Methoden meinst du bestimmt Klassen-Funktion. Entweder ist eine Funktion teil einer Klasse oder global, beides geht nicht. Und entweder es ist eine Funktion oder ein Funktionszeiger, beides geht nicht. Du kannst einen globalen- oder Klassenfunktionszeiger in einem Klassenobjekt speichern und aufrufen. Du kannst den Funktionszeiger dem Konstruktor geben. Das geht nicht viel eleganter als mit einem Funktionszeiger. Du kannst noch std::function nehmen, ist aber nur leicht andere Syntax für eine schlechtere Implementierung.
"Nur ein Klassentyp von außen" hört sich an, als wolltest du keine Vererbung benutzen. Wenn sich das ändert kriegst du deine VTables, ist aber eher nicht empfehlenswert.
-
Sag lieber, was du genau erreichen willst, nicht wie.
"Zu Beginn der Anwendung initialisieren" impliziert im Weiteren keine globalen Variablen. Tatsächlich hast du mit globalen/statischen Variablen langfristig mehr Probleme, verzichte darauf wann immer möglich.
-
Wenn es um Alternativen zu Funktionszeigern ginge, gäbe es da function objects aka Funktoren, mittels overloading von operator():
class Functor{ public: B operator() (C c){ ...; } };
-
manni66 schrieb:
Hört sich mach dem strategy desing pattern an.
Genau das.
Nur scheint diese implementierung über 3 pointer zu geht.
Mein Beispiel geht nur über den Funktionszeiger selber wenn der compiler inline beachtet.@nwp3
@NexusMit global meinte ich nur, dass die Klassen-Funktion nach der initalisierung für all Objekte der Klass gleich ist/bleibt.
-
Osbios schrieb:
Ich möchte Klassen Methoden welche globale Funktionszeiger sind.
Das geht nur mit statischen Methoden, oder den erwähnten Funktoren (Schau dir hierzu vielleicht einmal std::bind/std::function an).
Osbios schrieb:
So dass ich diese beim initalisieren meiner Anwendung setzen kann.
Das geht definitiv nur mit statischen Methoden, es sei den du gibst zur Laufzeit noch das konkrete Objekt mit (Auch das lässt sich mit std::bind durchaus bauen).