Передать функцию-член C ++ функции C - PullRequest
0 голосов
/ 25 сентября 2018

У нас есть структура, которая принимает указатели на функции C:

int one(int x)
{
}

int two(int x)
{
}

struct Cstruct
{
int (*fn1)(int);
int (*fn2)(int);
};

Теперь у меня есть класс C ++, имеющий следующие методы:

class A
{
public:
int one(int x)
{
}

int two(int x)
{
}

int three(int x)
{
struct Cstruct cstr = {&this->one, &this->two};
}
};

При попытке инициализировать адрес методов класса Aэкземпляру компилятора Cstruct выдает ошибку неверного преобразования?

Как я могу назначить адрес функции-члена класса для Cstruct?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы не можете сделать это, потому что указатель C ++ на нестатическую функцию-член не совместим с типом указателя на функцию, не являющуюся членом.Это связано с тем, что функциям-членам требуется дополнительный аргумент - объект, для которого должна быть вызвана функция-член, которая становится this указателем внутри вызова.

Если вы сделаете ваши функции-члены статичными, ваш код скомпилируется,Однако это не обязательно будет делать то, что вы хотите достичь, потому что one и two не имеют доступа к другим нестатическим элементам A.

Хитрость в передаче функций-членов в функции Cтребует передачи дополнительного указателя void* с «регистрационной» записью и передачи кода C обратно в статические функции обратного вызова:

struct Cstruct
{
    void *context; // Add this field
    int (*fn1)(void*, int);
    int (*fn2)(void*, int);
};

class A
{
public:
    static int oneWrap(void* ptr, int x)
    {
        return static_cast<A*>(ptr)->one(x);
    }

    static int twoWrap(void* ptr, int x)
    {
        return static_cast<A*>(ptr)->two(x);
    }

    int one(int x)
    {
    }

    int two(int x)
    {
    }

    int three(int x)
    {
        struct Cstruct cstr = {this, &this->oneWrap, &this->twoWrap};
    }
};

Код C должен будет передать значение context вfn1 и fn2:

cs.fn1(cs.context, 123);
cs.fn2(cs.context, 456);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...