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

Я использую библиотеку C++ paho-mqtt. Я использую асинхронную модель связи. Я создал класс Callaback и реализовал необходимые методы. Я также создал класс mqtt_client, который содержит очереди передачи и приема, а также несколько методов, таких как connect, send_data, get_recced_data и т. Д.

class mqtt_client
{
private:
    std::queue<std::string>     receive_queue, transmit_queue;
public:
    bool connect(void){
        mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
        callback cb(client, connOpts);
        client.set_callback(cb);
    }
    bool send_data(const std::string& data){
        transmit_queue.push(data);
        //if not tranmitting then start transmitting
    }
    std::string get_recieved_data(void);
};

class callback : public virtual mqtt::callback
{
public:
    void connected(const std::string& cause) override;
    void connection_lost(const std::string& cause) override;
    void delivery_complete(mqtt::delivery_token_ptr tok) override; //Pop data from mqtt_client::transmit_queue (if available)
    void message_arrived(mqtt::const_message_ptr msg) override; //Push data to mqtt_client::receive_queue
};

В реализации метода callback::message_arhibited. Я хочу скопировать полезную нагрузку сообщения и отправить ее в mqtt_client:: receive_queue, который находится в mqtt_client.

Аналогичным образом callback:: delivery_complete проверяет, доступны ли данные в mqtt_client:: transfer_queue, и, если имеется больше данных, он передает следующее сообщение.

Я хочу знать, какие у меня варианты здесь. Я не хочу отправлять объект mqtt_client в обратный вызов класса.

В Andorid я использовал намерение или интерфейс, чтобы добиться этого.

1 ответ

Как обсуждалось в комментариях, вы, вероятно, захотите передать ссылку на mqtt_client на ваш callbackобъект. Это просто сделать:

class mqtt_client
{
public:
    bool connect(){
        mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
        callback cb(*this, client, connOpts);
        client.set_callback(cb);
    }
};

class callback : public mqtt::callback
{
private:
    mqtt_client& client;
public:
    callback(mqtt_client& _client, mqtt::async_client async_client, some_type connOpts) :client(_client) {}
};

Один странный аспект вашего кода заключается в том, что вы создаете mqtt::async_client в стеке твоего connect() функцию, передав ее в callback объект, который вы также создаете в стеке, а затем передаете callbackвозразить асинхронному клиенту. Все эти объекты будут уничтожены, когда эта функция завершится; очень маловероятно, что они предназначены для такого использования. Я не знаком с библиотекой MQTT и поэтому не могу сказать вам, как они предназначены для использования.

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