Pointer auf Memberfunktionen
-
Hi ich bin da auf ein merkwürdiges Problem gestoßen.
Es gibt ja Pointer auf Funktionen, mit denen ich die Funktionen auch ausführen kann.
Das geht aber irgendwie nur mit globalen Funktionen und nicht mit Memberfunkionen.
Also ungefähr soclass CKlasse { public: bool m_Foo(int i) { return(i>0); //Nur zur demo } }; bool g_Foo(int i) { return(i<0); //Auch nur Demo } int main() { bool (*p_Foo)(int); //Pointer auf Foo p_Foo=g_Foo; //Zuweisung klappt cout<<(*p_Foo)(3)<<endl; //Benutzen klappt auch //Aber wie geht das mit Memberfunktionen? //1. Variante CKlasse c; p_Foo=c.m_foo; //geht nicht //2. Variante //m_Foo als static -> geht nicht weil ich damit auf Membervariablen //zugreifen können muss ...Ich dachte noch an eine 3. Variante mit einer globalen inline Funktion, deren Pointer benutzt wird und die m_Foo aufruft. Damit hab ich aber das Problem dass die CKlasse-Instanz nicht global sein darf, dafür hab ich meine Gründe
Wie kann ich das Problem lösen?
Hat jemand einen oder mehrere Vorschläge?
Ich bin dankbar für jede Hilfe! :xmas1:
-
Das haben wir hier mittlerweile fast wöchentlich :xmas2: Aber nuja ^^
Aja geiler Stil ne Memberfunktion per m_ zu kennzeichnen ^^struct foo { void bar() { std::cout << "foo() function called" << std::endl; } typedef void(foo::*fnPtr)(); }; int main() { foo::fnPtr ptr(&foo::bar); foo inst; (inst.*ptr)(); }wäre es, vereinfacht dargestellt ... achja, static Memberfunktionen lassen sich (fast) wie globale Funktionen behandeln.
template <class obj, typename _Result, typename _Param1> struct mem_fn_ptr { mem_fn_ptr(obj const& instance, fnPtr func) : m_obj(instance), m_func(func) {} _Result operator()(_Param1 const& param) { return (m_obj.*m_func)(param); } private: obj const& m_obj; typedef _Result (obj::*fnPtr)(_Param1 const&); fnPtr m_func; }; class foo { bool bar(std::istream const& stream) { return !!stream; } }; int main() { foo inst; mem_fn_ptr<foo, bool, std::istream>(inst, &foo::bar)(std::cin); }... wobei die Klasse foo jetzt natürlich nur ein Beispiel ist und in dem Fall nur kontrolliert, ob der übergebene istream ein fail|bad-bit gesetzt hat.
-
Es gibt hier auch ne FAQ, wo sowas drin steht.
-
(D)Evil schrieb:
Das haben wir hier mittlerweile fast wöchentlich :xmas2:
Dafür hab ich den Eindruck dass die "meine konsole verschwindet" fragen allmählich zurückgehen. Kann doch nur positiv sein wenn die Leute sich mehr auf die wirklichen C++-Problemchen stürzen
Und spätestens wenn die Frage in 200 verschiedenen Versionen aufgetaucht ist, wird sie auch nurnoch einmal in 2 Monaten kommen und das nächste Thema ist mit dem Dauer-Bombardement dran 
-
Danke!
Und frohe Weihnachten" :xmas1: