Funkcja zwrotna – błędy kompilacji

0

Witam Serdecznie. Używam zewnętrznej biblioteki i mam problem z jedną funkcją
Budowa funkcji z biblioteki:

DLLEXPORT  ResultCode __stdcall SetCallbackStatus(void ( *ptr)( int ) );

Jeśli zrobię tak wszystko działa:

void wyswietl_1(int liczba)
{
ShowMessage("Wyswietl_1");
}

int odp=ClientW::SetCallbackStatus(wyswietl_1);

Ale jeśli zrobię tak to dostaję błędy:

class User
{
   public:
   void wyswietl_1(int liczba)
   {
   ShowMessage("Wyswietl_1");
   }
};

User *a=new User();
int odp=ClientW::SetCallbackStatus(a->wyswietl_1);
[C++ Error] Unit1.cpp(47): E2034 Cannot convert 'void (* (_closure )(int))(int)' to 'void (*)(int)'
[C++ Error] Unit1.cpp(47): E2342 Type mismatch in parameter 'ptr' (wanted 'void (*)(int)', got 'void')
1

Wskaźnik na wolną funkcję i wskaźnik na element klasy to zupełnie różne rzeczy. Koncepcyjnie, możesz sobie wyobrazić, że wszystkie niestatyczne funkcje w klasie mają dodatkowy ukryty parametr - wskaźnik this. Wobec tego próbujesz przekazać funkcję przyjmującą dwa parametry jako funkcję, która przyjmuje jeden - i z tym jest problem.

Ponadto w poprzednim temacie dostał​eś już informację, że taki sposób pobrania adresu funkcji klasy jest nielegalny.

Jeśli twój callback nie ma wersji ze stanem (często nazywanym context) to czystej/łatwej metody na poprawę stanu rzeczy nie ma.

0

Nie mam wersji context. Chciałem użyć klasy by w przyszłości łatwiej było modyfikować kod programu. A mógłbyś jeśli nie sprawi problemu przykład z użyciem klas bo na tym mi zależy.

0

Możesz zrobić tak:

struct ICallbackStatus
{
	virtual void __stdcall Invoke(int) = 0;
};

DLLEXPORT  ResultCode __stdcall SetCallbackStatus( ICallbackStatus* );

...

class User : public ICallbackStatus
{
public:

	virtual void __stdcall Invoke(int) 
	{
		ShowMessage("Wyswietl_1");
	}
};

...

User *a = new User;
int odp = ClientW::SetCallbackStatus(a);

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