wskaźniki do metody przekazywany jako argument funkcji

0

Witam.
Mam taki problem:

class tmp{
   public:
      void funCallBack(int a){

      }
};

typedef void (*fun)(int arg);

int funkcja( fun funC){
   //tutaj powinno być wywołanie funkcji callbackowej : 
   funC(5);
   return 0;
}

void main(){
   tmp objectTmp;
  <b> //tutaj jest problem</b>   funkcja(objectTmp.funCallBack);
}

Problem polega na tym, ze kompilator nie chce przeyjąć takiej konstrukcji ponieważ nie zgadzają się typy wskaźników, rzutowanie nic nie daje. Próbowałem wielu metod przekazania metody jako argumentu,ale wszystkei zawiodły:(, dodam jeszcze ze metoda nie może być w żadnym wypadku statyczna.
Pozdraiwam.

0

Poprawna wersja ze wskaźnikiem na funkcję składową klasy:

class tmp{ public: void funCallBack(int a){ } };

typedef void (tmp::*fun)(int arg);

int funkcja(tmp* obj, fun funC){
   //tutaj powinno być wywołanie funkcji callbackowej :
   (obj->*funC)(5);
   return 0;
}

int main(){
  tmp objectTmp;
  funkcja(&objectTmp, &tmp::funCallBack);
  return 0;
}

Prawdopodobnie nie jest to to, co byś chciał. W standardowym C++ jest właśnie taki mechanizm „wskaźników na metodę składową klasy”. Żeby ją wywołać, musisz podać obiekt, na którym ma metoda pracować – bo można ją wykonać tylko dla konkretnego egzemplarza, jak każdą metodę niestatyczną.

Implementacje C++ mogą zawierać rozszerzenia (“closure”), pozwalające jednym wskaźnikiem pokazać jednocześnie metodę do wykonania i element, dla którego ma być wykonana. Podobną funkcjonalność można uzyskać przenośnie przy pomocy sztuczek z szablonami – patrz np. dokumentacja w boost: http://www.boost.org/doc/html/function/tutorial.html#id1186900

0

Problem w tym, że każda niestatyczna funkcja składowa ma jeden niejawny argument (this) który odpowiada temu co stoi przed operatorem "." lub "->".
Problem w tym, że ty potrzebujesz przepchać funkcję niejawnie binarną (dwuargumentową) w miejscu, gdzie wymagana jest funkcja unarna (jednoargumentowa).
Teraz moje pytanie brzmi: co to jest funkcja?
Twoja metoda? Czy może jakaś metoda z szablonów STL?
Jeśli to ostatnie to istnieją gotowe proste rozwiązania.
Jeśli to pierwsze to powinieneś przepisać tą metodę w nowej wersji z odpowiednim argumentem (jak napisał poprzednik) lub argumentem obiekt funkcyjny.

edit:
powyżej troszkę niejasno się wyraziłem, ale kod wszystko wyjaśni (chociaż może wyglądać na trochę zakręcony)
Rozwiązanie to wygląda tak (przez szablony i funkcje dopasowujące):

#include <iostream>
#include <functional>
using namespace std;

class tmp
{
   public:
      void funCallBack(int a)
      { cout << "tmp::funCallBack a = "<< a <<endl; }
};

template<class T> int funkcja(T funC) // poprawka konwertująca na szablon
{
   funC(5);
   return 0;
}

void main(){
   tmp objectTmp;

   funkcja(bind1st(mem_fun1(&tmp::funCallBack),&objectTmp));
}
0

Dzięki wielkie

1 użytkowników online, w tym zalogowanych: 0, gości: 1