Совместное использование обратного вызова члена класса с другим классом

У меня есть два класса: 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);

}

Надеюсь, моя проблема понятна и код не слишком отредактирован.

Любой вклад приветствуется

Почему вы решили использовать разные типы postUpdate и callback в NADC338::register_callback?

JaMiT 01.09.2024 00:14

«Надеюсь [...] код не слишком отредактирован». -- Не нужно полагаться на надежду. Скопируйте код из вашего вопроса и попробуйте скомпилировать его как есть. Если первое сообщение об ошибке — «'=': функция как левый операнд», то код не слишком отредактирован.

JaMiT 01.09.2024 00:15

Обратные вызовы — это что-то из C. Предпочтительны делегаты C++.

3CxEZiVlQ 01.09.2024 00:19

«Надеюсь [...] код не слишком отредактирован». -- Я посмотрел и пришел к выводу, что код недостаточно отредактирован. Отбросьте WebUiCoroutine, так как это не обязательно для возникновения ошибки. Удалите параметр, поскольку он не нужен и его тип (crow::json::wvalue) не имеет определения. Вставьте тело функции для облегчения чтения и в итоге получите #include <functional>struct NADC338 {void (*postUpdate) ();void register_callback(std::function<void()> callback) {postUpdate = callback;}}; Коротко и слишком по делу.

JaMiT 01.09.2024 00:24

Спасибо за быстрые ответы и помощь по моей проблеме. Как отметил @SoronelHaetir, это оказалось легко исправить. у меня просто не было понимания

Rhaoama 01.09.2024 00:33

@Rhaoama «Как отметил СоронельХаетир, это оказалось легко исправить». -- Это не сюрприз. Я имею в виду, никто не предполагал, что исправить это будет сложно. На самом деле ответ был настолько простым, что я надеялся, что вы сами его обнаружите, если вам предложат объяснить свой код (см. отладка резиновой утки) в рамках улучшения вашего вопроса. Опять же, игнорировать все предложения по улучшению вашего вопроса — ваша прерогатива.

JaMiT 01.09.2024 03:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте PostUpdate std::function, а не прямым указателем на функцию.

Невозможно применить std::function, когда эта std::function несет состояние (как это должно быть у вас из-за привязки).

Вместо этого сделайте это:

std::function<void(crow::json::wvalue)> PostUpdate;

Другие вопросы по теме