Funktionszeiger und Klassen
-
Hi,
mein Problem ist func3, hier brauche ich eine Lösung...
kann mir da jemand helfen ?class a_class { void (*callback)(char *value); public: a_class (void) { } void set_callback (void (*new_callback)(char *value)) { this->callback = new_callback; } }; void func1 (char* value); class b_class { public: char* text; a_class a; static void func2 (char* value) { this->text = value; // geht bekanntlicherwise nicht } void func3 (char* value) { this->text = value; // so soll es sein } b_class (void) { a.set_callback (func1); // funktioniert problemlos, ich hätte jedoch mein "char* text" gerne unter "private:", was so nicht geht a.set_callback (b_class::func2); // funktioniert auch, ist nur dummerweise static, geht daher wiederum nicht a.set_callback (*this.*func3); // funktioniert leider nicht, hab ich irgendwo im Internet gefunden } }b; void func1 (char* value) { b.text = value; }
-
evtl. sowas in der art vlt.?:
template<class C> class c_class { void (C::*callback)(char* val); public: c_class() {}; void set_callback(void (C::*ncallback)(char*val)) { callback=ncallback; }; }; class b_class { char* text; c_class<b_class> c; a_class a; public: void func3(char* value) { text=value; }; b_class() { c.set_callback(func3); }; };
-
Hallo Cpt. Tanga,
leider funktioniert das Beispiel nicht so richtig ...
Hier sind die Compilerfehler:g++ -Wall -c demo.cpp -o demo.o demo.cpp: In constructor `b_class::b_class()': demo.cpp:25: error: no matching function for call to `c_class<b_class>::set_callback(<unknown type>)' demo.cpp:9: error: candidates are: void c_class<C>::set_callback(void (C::*)(char*)) [with C = b_class] make: *** [demo.o] Fehler 1Obiges Beispiel habe ich 1:1 übernommen jedoch ohne Zeile "a_class a;"
mfG
Schreck
-
habe den fehler leider nicht bemerkt (sowas kommt durch vc6 :)).
(waer wohl ohne irc auch nicht selber auf die fehlerquelle gekommen):#include <iostream> using namespace std; template<class C> class c_class { void (C::*callback)(char* ); C * obj; public: c_class():obj(0){}; void set_callback(C * o , void (C::*ncallback)(char*)) { obj = o; callback=ncallback; }; void call( char * data ) { if(obj) ((*obj).*callback)(data); } }; class b_class { char* text; c_class<b_class> c; public: void func3(char* value) { text=value; cout << text << endl; }; b_class() { c.set_callback(this,&b_class::func3); }; void call(char * data) { c.call(data); } }; int main() { b_class b; char data[] = "Hello World"; b.call(data); return 0; };endfassung by evilissimo. -ist wohl auch in seinem sinn wenn ich das hier mit dazu poste (auch von ihm):
http://developer.berlios.de/projects/callbackext
http://callbackext.berlios.de/mfg.
-
Naja endfassung ist gut, ich hab nur dran rumgeflickt bis es funktioniert hat *g*
Wirklich toll ist es net

-
Danke

-
Hi evilissimo,
Dein calbackext ist soo gut, daß ich es gleich in meinem Prog verwende.
Auch wenn es etwas Überdimmensioniert ist.... Dafür ist es LGPL und besteht
nur aus .hpp Dateien.... (war innerhalb von ca. 10 min integriert)Nochmals Danke