У меня есть два класса: WebUiCoroutine
и NADC338
(Рабочий). Класс NADC338
обрабатывает некоторые сетевые функции, после чего я хочу, чтобы он «отправил сообщение» в класс WebUiCoroutine
(который записан в заголовочном файле). По сути, я хочу передать/назначить postHandler
от WebUiCoroutine.h
до postUpdate
в NADC338
classdsdsdsdsdsdsd
Я пытался передать обратный вызов, как показано ниже, и многими другими способами:/ Этот не работает с сообщением '=': function as left operand
Он во многом основан на этом вопросе и многих других сообщениях Stack Overflow. Я уверен, что я неправильно понял/упустил что-то важное.
WebUiCoroutine.h
class WebUiCoroutine {
NADC338 nadAPI = NADC338("someIPAdress", port);
public:
WebUiCoroutine() {
nadAPI.register_callback(std::bind(&WebUiCoroutine::postHandler, this, std::placeholders::_1));
}
void postHandler(crow::json::wvalue) {
//call another class member method of WebUiCoroutine
}
}
NADC338.cpp
void NADC338::register_callback(std::function<void(crow::json::wvalue)> callback) {
postUpdate = callback;
}
NADC338.h
class NADC338 {
NADC338();
NADC338(string ip, int port);
public:
void (*postUpdate) (crow::json::wvalue);
void register_callback(std::function<void(crow::json::wvalue)> callback);
}
Надеюсь, моя проблема понятна и код не слишком отредактирован.
Любой вклад приветствуется
«Надеюсь [...] код не слишком отредактирован». -- Не нужно полагаться на надежду. Скопируйте код из вашего вопроса и попробуйте скомпилировать его как есть. Если первое сообщение об ошибке — «'=': функция как левый операнд», то код не слишком отредактирован.
Обратные вызовы — это что-то из C. Предпочтительны делегаты C++.
«Надеюсь [...] код не слишком отредактирован». -- Я посмотрел и пришел к выводу, что код недостаточно отредактирован. Отбросьте WebUiCoroutine
, так как это не обязательно для возникновения ошибки. Удалите параметр, поскольку он не нужен и его тип (crow::json::wvalue
) не имеет определения. Вставьте тело функции для облегчения чтения и в итоге получите #include <functional>
struct NADC338 {
void (*postUpdate) ();
void register_callback(std::function<void()> callback) {
postUpdate = callback;
}
};
Коротко и слишком по делу.
Спасибо за быстрые ответы и помощь по моей проблеме. Как отметил @SoronelHaetir, это оказалось легко исправить. у меня просто не было понимания
@Rhaoama «Как отметил СоронельХаетир, это оказалось легко исправить». -- Это не сюрприз. Я имею в виду, никто не предполагал, что исправить это будет сложно. На самом деле ответ был настолько простым, что я надеялся, что вы сами его обнаружите, если вам предложат объяснить свой код (см. отладка резиновой утки) в рамках улучшения вашего вопроса. Опять же, игнорировать все предложения по улучшению вашего вопроса — ваша прерогатива.
Сделайте PostUpdate std::function, а не прямым указателем на функцию.
Невозможно применить std::function, когда эта std::function несет состояние (как это должно быть у вас из-за привязки).
Вместо этого сделайте это:
std::function<void(crow::json::wvalue)> PostUpdate;
Почему вы решили использовать разные типы
postUpdate
иcallback
вNADC338::register_callback
?