Передавать данные из одного класса в другой без передачи объекта
Я использую библиотеку 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 и поэтому не могу сказать вам, как они предназначены для использования.