2011-08-16 15 views
10

Próbuję przekazać funkcję do innej funkcji jako parametru, a obydwie funkcje są członkami tej samej klasy.C++: Używanie wskaźników funkcji z funkcjami składowymi

Dostaję dziwny błąd i nie mogę się dowiedzieć, jaki jest problem.

Oto moje funkcje:

void myClass::functionToPass() 
{ 
    // does something 
} 

void myClass::function1(void (*passedFunction)()) 
{ 
    (*passedFunction)(); 
} 

void myClass::function2() 
{ 
    function1(&myClass::functionToPass); 
} 

Jednak ja otrzymuję następujący błąd:

cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)' 
    to 'void(__cdecl*)(void)' 

Więc co daje? Czuję, że próbowałem każdej odmiany, aby spróbować to zrobić. Czy potrafisz nawet przekazywać wskaźniki funkcji dla funkcji składowych? Jak mogę to uruchomić?

Uwaga: Tworzenie funkcji staticToPass nie jest tak naprawdę poprawną opcją.

+0

Ten komunikat o błędzie zawiera wszystkie informacje niezbędne do rozwiązania problemu. –

+0

Użycie 'boost :: function' może być łatwiejsze niż użycie wskaźników funkcji. Musiałbyś sprawdzić, czy to powinno być 'boost :: function ' (w takim przypadku 'function2' powiąże' this') lub 'boost :: function ' (w takim przypadku 'function1' powinien przekazać '* this') – MSalters

Odpowiedz

11

Możesz przekazywać wskaźniki funkcji do funkcji składowych. Ale to nie jest to, co robi twój kod. Jesteś zdezorientowany pomiędzy regularnymi wskaźnikami funkcji (void (*passedFunction)() jest zwykłym wskaźnikiem funkcji) a wskaźnikami do funkcji składowych (&myClass::functionToPass jest wskaźnikiem do funkcji składowej). Nie są to te same rzeczy i nie są kompatybilne.

można przepisać kod jak ten

void myClass::function1(void (myClass::*passedFunction)()) 
{ 
    (this->*passedFunction)(); 
} 

Teraz Twój kod stosując wskaźniki do funkcji składowych, ale oczywiście oznacza to, że nie będą mogli przechodzić regularne wskaźnik funkcji.

+0

Ma sens! Nie mam szansy na przetestowanie tego do jutra, ale jeśli to się uda, na pewno się zgodzę. –

+1

Samouczek pointeru funkcji: http://www.newty.de/fpt/index.html (bardzo przydatny) –

1

Jak wskazano przez innych, Twój błąd jest związany z typem wskaźnika funkcji. Powinien to być void (myClass::*passedFunction)().

Oto dobry tutorial na temat używania wskaźników do funkcji członków w C++.

+0

, więc przy użyciu jakiejś odmiany" tej "pracy? –

+0

Niestety, przeoczyłem fakt, że przekazałeś wskaźnik funkcji do funkcji składowej tej samej klasy. Myślałem, że przekazujesz go do jakiejś innej funkcji, w którym to przypadku będziesz potrzebował obiektu 'myClass' do wywoływania funkcji wskazywanej przez' passedFunction'. – Dima

Powiązane problemy