Присвоение функции-члена класса указателю на функцию в C ++ - PullRequest
1 голос
/ 29 апреля 2020

Я назначил функцию переменной

p_samplen_->onData = onData;

PVOID onData(PVOID args) {

}

, и она сработала.

Я пытался присвоить эту переменную функции в классе, но она не сработала.

p_samplen_->onData = &MyClass::onData;

PVOID MyClass::onData(PVOID args) {

}

ошибка

test.cpp:32:48: error: assigning to 'startRoutine' (aka 'void *(*)(void *)') from incompatible type 'void *(MyClass::*)(void *)'

Пожалуйста, помогите мне в этом.

1 Ответ

2 голосов
/ 29 апреля 2020

Ваш синтаксис может быть неправильным. Указатель члена - это категория другого типа, отличная от обычного указателя. Указатель члена должен использоваться вместе с объектом его класса:

#include <iostream>

class MyClass 
{
public:
    void *f(void *);
    void *(MyClass::*x)(void *); // <- declare by saying what class it is a pointer to
};

void *MyClass::f(void *ptr) 
{
    return ptr;
}


int main() 
{
    MyClass a;
    a.x = &MyClass::f; // use the :: syntax
    int b = 100;
    std::cout << *(int *)((a.*(a.x)) (&b)) << std::endl;
    return 0;
}

ИЛИ

Вы можете использовать функциональный и bind в C ++.

Пример:

#include <iostream>

#include <functional>

class MyClass 
{
public:
    void *f(void *);
    std::function<void *(void *)> function;
};

void *MyClass::f(void *ptr) 
{
    return ptr;
}


int main() 
{
    int b = 100;

    MyClass a;
    a.function = std::bind(&MyClass::f, &a, &b);
    std::cout << *(int *)a.function(&b) << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...