CallByName in Visual C++
-
Hallo zusammen,
gibt es eine CallByName-Methode in Visual C++? Also eine Methode die eine bestimmte Methode mit dem Namen aus einem string aufruft?
-
Was willst du denn erreichen? (zur Laufzeit kennt das Programm keine Variablennamen mehr, nur noch die Adressen)
-
Nein, sowas gibts nicht.
Kann man sich aber zusammen bauen.
Ich hab hier mal ein Beispiel gemacht für std. c++
Kann man entsprechend auf MFC umbauen#include <iostream> #include <map> #include <string> using namespace std; void func1() { cout << "'func1' aufgerufen" << endl; } void func2() { cout << "'func2' aufgerufen" << endl; } void func3() { cout << "'func3' aufgerufen" << endl; } typedef void (*pFunction)(); int main( int argc, char* argv[] ) { map<string, pFunction> functions; functions["f1"] = func1; functions["f2"] = func2; functions["f3"] = func3; string action; getline(cin, action); pFunction f = functions[action]; if( f ) f(); else cout << "Funktion nicht gefunden!" << endl; cin.get(); return EXIT_SUCCESS; }Wenn man nun in der Konsole f1, f2 oder f3 eingibt, dann wird die entsprechende Funktion aufgerufen
-
Also ich kenne diese Methode aus Visual Basic 6... da ruft man einfach CallByName(Funktionsname, Parameter) auf und dann wird die entsprechende Methode mit dem Namen aufgerufen.
Ich möchte einfach, dass jemand auf der Konsole z.B. Summe eingeben kann oder Multipliziere und dann die entsprechende Methode mit dem Namen Summe bzw. Multipliziere aufgerufen wird.
-
Wenn du sowas brauchst, mußt du es selber bauen (wie das aussehen kann, hat Airdamn angedeutet).
-
Wenn Du daran denkst eine Makro Sprache zu bauen, dann lohnt sich ein Blick auf die Mögichkeit VB-Script zu hosten.
-
Danke erstmal für die Antworten...
Ich wollte es jetzt mal so machen wie Airdamn es vorgeschlagen hat... meine Funktionen sollen aber noch einen Parameter übergeben bekommen... Nun habe ich folgendes gemacht...
class CTest { public: void Summe(int iWert); private: typedef void (CTest::* pFunction)(int); typedef std::map<CString, pFunction> functions; void Init(); functions m_functions; }Dann habe ich noch folgendes gemacht:
void CTest::Init() { m_functions["Summe"] = &CTest::Summe; }Um anschließenden in einer Klassenmethode von CTest folgendes aufzurufen:
pFunction test = m_functions["Summe"];Nun ist das Problem wenn ich test(5) aufrufe gibt es einen Fehler:
Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
Wieso?
-
Methodenzeiger sind etwas schwieriger zu handhaben (und benötigen vor allem immer ein this-Objekt, auf dem sie arbeiten könnten) - wenn es geht, solltest du besser darauf verzichten und stattdessen "normale" Funktionen verwenden:
void Summe(int); class CTest { public: typedef void (*func)(int); map<string,func> functions; }
-
Also ein this Objekt habe ich ja schon :)... aber wie bringe ich den nun meinen Funktionszeiger und mein this Zeiger dazu die Funktion aufzurufen :)... ich würde das schon gerne "verstehen" bzw. mal ausprobieren :).
-
Ich habs jetzt mal so gemacht
(this->*test)(5);Und es läuft :D... Ist das so nun eine eher schlechte Lösung?!