Funktionen als Parameter
-
Hallo,
ich möchte gern eine Klasse erstellen, welche beliebige Werte in Dateien schreibt. Soweit so gut.
Nun würde ich aber gern haben, dass eine Client-Klasse sich zum Schreiben von Werten so anmeldet, dass sie ihre entsprechende get-Methode (des zu schreibenden Wertes) übergibt, eventuell mit entsprechenden Datentyp, um das binäre Schreiben dann zu erleichtern/ermöglichen. So dass die Schreibeklasse dann je nach Konvention die entsprechenden Werte dann OnDemand abrufen kann.
So ein get-Methode kann z.B. auch mit einem index als Parameter aufgerufen werden, so dass die Schreibeklasse z.B. die Werte getMethodeA(1), getMethodeB(1), getMethodeA(2), getMethodeB(2), ... , getMethodeA(100), getMethodeB(100) ohne Clientbemühungen ausgeben kann.
Ist soetwas möglich? Wenn ja, wie geht das oder wo müsste ich mich da informieren?
Danke im Voraus,
Mat.
-
Google mal nach funktionzeiger;)
da kannst funktionen wie objekte/zeiger behandeln und je nach bedarf wechseln
-
Google lieber nach "Methodenzeiger", denn Funktionszeiger sind noch aus C und können nur für freie Funktionen und statische Methoden verwendet werden.
-
kannst auch hier im Forum "googlen", hier gabs auch schon einige Threads zum Thema...
-
-
Mit meinen stümperhaften Kenntnissen hätte ich eine abstrakte Basisklasse (als Interface) definiert und dann entsprechende Ableitungen für die gewünschten TypeHandler. Instanzierte Objekte der verschiedenen Handler dann in eine std::map gesteckt und bei Bedarf den entsprechenden aufgerufen.
Grüße...
Heiko
-
Das Problem bei Methodenzeigern ist, dass du ja das Objekt mit angeben musst, auf das sich die Funktion berufen soll.
Wenn du allerdings folgendes ist, hast du glück

class foo { public: foo(std::size_t id) : m_id(id) {} protected: typedef bool (foo::*fnCall)(std::size_t, void*); void register_call(std::size_t id, fnCall call) { m_func[id] = call; } bool handle_call(std::size_t id, void* data) { std::map<std::size_t, fnCall>::iterator it = m_func.find(id); return (it != it.end() ? (*this.*(*it).second)(m_id, data)); public: void show(std::ostream& out) { out << handle_call(10, "Das ist ein Test"); << std::endl; private: std::map<std::size_t, fnCall> m_func; std::size_t m_id; };class bar : public foo { public: bar() : foo(1) { register_call(10, static_cast<fnCall>(&bar::use_a)); } protected: void use_a(std::size_t id, void* data) { std::cout << id << " | " << static_cast<const char*>(data) << std::endl; } };
Sieht bescheuert aus ... geht aber 