Установить функцию обратного вызова API PubSubClient в классе - PullRequest
0 голосов
/ 04 октября 2019

Я хочу вызвать функцию setCallback() в конструкторе класса с закрытым методом в качестве параметра. Это не работает из-за сигнатуры функции, требуемой функцией. Моя проблема с функцией заключается в том, что я не могу получить доступ к закрытым полям определенного объекта моего класса.

Я уже пытался создать простую функцию в файле класса, которая не работала из-за статическогоконтекст. Я также попытался просто передать метод, который не работает из-за подписи.

#include <PubSubClient.h>

class Test
{
private:
    void callback(char *topic, uint8_t *payload, unsigned int)
    {
        // things
    }

public:
    Test(PubSubClient psc)
    {
        psc.setCallback(callback);
    }
};

Произошла следующая ошибка компиляции.

no suitable constructor exists to convert from "void (char *topic, uint8_t *payload, unsigned int)" to "std::function<void (char *, uint8_t *, unsigned int)>"

1 Ответ

2 голосов
/ 04 октября 2019

Я не знаком с программированием на Arduino, поэтому мой ответ предполагает, что вы имеете в виду этот класс. Кроме того, я не знаю, намеренно ли ваш образец конструирует, используя значение PubSubClient? Из того, что я вижу, это должна быть ссылка или указатель, например

Test(PubSubClient& psc)
{
    psc.setCallback(callback);
}

Сообщение об ошибке дает довольно хорошее объяснение того, что не так. Метод setCallback () ожидает std :: function и не может создать его из значения функции-члена класса. пример раздела std :: function cppreference предоставляет вам широкий спектр различных способов создания std :: function. Если вы уверены, что ваш тестовый объект будет оставаться живым до тех пор, пока PubSubClient, то я бы предложил использовать пример std :: bind, например

Test(PubSubClient& psc)
{
    using std::placeholders::_1;
    using std::placeholders::_2;
    using std::placeholders::_3;
    psc.setCallback(std::bind( &Test::callback, this, _1,_2,_3));
}
...