将数据从一类传递到另一类而不传递对象

时间:2019-09-13 04:23:10

标签: c++ paho pahocpp

我正在使用paho-mqtt c ++库。我正在使用异步通信模型。 我创建了Callaback类并实现了必要的方法。 我还创建了一个mqtt_client类,该类保存传输和接收队列以及几种方法,例如connect,send_data,get_recieved_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_arrived方法的实现中。我希望复制消息的有效负载并将其推送到位于mqtt_client中的mqtt_client :: receive_queue。

类似地,callback :: delivery_complete检查mqtt_client :: transmit_queue中的数据是否可用,如果存在更多数据,它将传输下一条消息。

我想知道我在这里有什么选择。我不希望将mqtt_client对象发送到类回调。

在Andorid中,我使用了意图或接口来实现这一目标。

1 个答案:

答案 0 :(得分:2)

如评论中所述,您可能确实希望将对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库不熟悉,因此无法告诉您如何使用它们。