Methoden über String aufrufen



  • Hallo,

    ich fasse mich kurz:
    meine Anwendung besteht aus einer Eingabe, welche dann in einer Map die entsprechende Funktion rausfindet und aufruft. War bislang kein Problem und funktioniert auch, das Problem aber ist - ich will nun eine Methode innerhalb einer Klasse aufrufen, wobei diese Methoden auch in der Map sind.

    Übergangsmäßig habe ich es mit "Zwischenfunktionen" gelöst, was aber leider nicht schön ist.

    Hier mal der Quellcode:

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    class Woot {
    public:
    	int foo() {
    		return 42;
    	}
    	int bar() {
    		return 1337;
    	}
    };
    
    Woot d;
    
    int foo() { return d.foo(); }
    int bar() { return d.bar(); }
    
    int main() {
    	map<string, int(*)()> m;
    	m["foo"] = &foo;
    	m["bar"] = &bar;
    
    	string var;
    	bool running = true;
    	while(running) {
    		cin >> var;
    
    		if(var != "quit") {
    			if(m.count(var) != 0) {
    				cout << m[var]() << endl;
    			} else
    				cout << "sie sack!" << endl;
    		} else
    			running = false;
    	}
    }
    

    Ich will mir nun einfach die zwei Funktionen foo und bar schenken und direkt die Methoden aufrufen.

    Danke schonmal

    P.S. Ich programmiere normal kein C++, also nicht wundern.


  • Mod

    Das Stichwort das du suchst ist member function pointer. Die genaue Umsetzung hängt davon ab, an welcher Stelle das aufrufende Woot bekannt ist. Du kannst sowohl einen blanken Zeiger in der map speichern und dann diesen zum
    Aufruf auf einem Woot-Objekt benutzen, als auch ein Proxyobjekt, welches sich ein bestimmtes Woot merkt und dann immer nur dieses benutzt. Ersteres findest du in Anleitungen zu member function pointers (oder falls dir jemand noch ein konkretes Beispiel gibt), für letzteres brauchst du zusätzlich noch die Hilfsfunktionen aus dem functional-Header. Dieser wurde in C++11 mit std::bind und std::function stark verbessert, falls möglich solltest du dies benutzen. In der Boost-Bibliothek gibt es auch etwas sehr ähnliches, falls C++11 nicht in Frage kommt. Die Funktionsobjekte und Bindefunktionen aus reinem C++98 sind dagegen die Seuche.



  • Gefunden und geklappt, danke :)...


Anmelden zum Antworten