Описание:
У меня проблема со сторонней библиотекой, эта библиотека называется TVideoGrabber. Когда я передаю адрес своей функции в библиотеку, я теряю доступ к методам и свойствам MyClass из метода обратного вызова.
m_pAPI->SetCallback(OnCallback);
Эта строка выше передает адрес OnCallback API. Однажды API вызывает метод OnCallback при обновлении. Это работает отлично до сих пор.
Строка, о которой идет речь:
a->SetA(api->GetNumber());
Я знаю, что приведенный выше синтаксис неверен, но он должен иллюстрировать то, что я пытаюсь сделать, я хотел бы установить значение A из API.
Эта проблема:
когда API вызывает функцию OnCallback, отправителем является адрес объекта m_pAPI, и у меня нет доступа к объекту MyClass.
Вопрос:
Как я могу получить доступ к объекту MyClass
Вот полный пример кода:
void MyClass::OnCallback(void* Object, void* sender)
{
API* api = (API*)(sender);
// NO ACCESS TO MyClass properties or methods :(
a->SetA(api->GetNumber());
}
class MyClass
{
public:
MyClass();
~MyClass();
static void CALLBACK OnCallback(void* Object, void* sender);
void SetA(int a);
int GetA() const;
private:
API* m_pAPI;
int a;
}
MyClass::MyClass()
: a(0)
{
m_pAPI = new API;
// Register for callbacks
m_pAPI->SetCallback(OnCallback);
}
MyClass::~MyClass()
{
delete m_pAPI;
}
int main()
{
MyClass my;
std::cout << "Value from API is " << my.GetA();
return 0;
}
Заранее спасибо! Ждем ваших ответов!
попробуйте заменить:
m_pAPI = new API;
от:
m_pAPI = new API(this);
это будет использовать 2-й конструктор класса CVideoGrabber из TVideoGrabber.h:
CVideoGrabber (void* classPtr);
и указатель экземпляра вашего класса будет возвращен параметром «отправителя» событий обратного вызова.
Других решений пока нет …