【发布时间】:2020-10-15 22:28:57
【问题描述】:
我在类构造函数中有这段代码:
MqttSensorInterface::MqttSensorInterface(Client& client, String sensorTopic)
{
this->mqttClient = PubSubClient(client);
this->sensorTopic = sensorTopic;
this->askMeasureTopic = sensorTopic + "/askmeasure";
this->publishMeasureTopic = sensorTopic + "/measure";
}
但是在创建新的MqttSensorInterface对象时使用构造函数后,在构造函数中实例化的PubSubClient对象被破坏(调用PubSubClient析构函数)。我是 C++ 的新手,不知道这段代码是否有问题。由于PubSubClient对象在构造函数中被实例化,但是类成员mqttClient被设置为这个对象,它的作用域是什么?
PubSubClient 构造函数代码:
PubSubClient::PubSubClient(Client& client) {
this->_state = MQTT_DISCONNECTED;
setClient(client);
this->stream = NULL;
this->bufferSize = 0;
setBufferSize(MQTT_MAX_PACKET_SIZE);
setKeepAlive(MQTT_KEEPALIVE);
setSocketTimeout(MQTT_SOCKET_TIMEOUT);
}
编辑
通过这种方式使用成员初始化器列表解决:
MqttSensorInterface::MqttSensorInterface( Client& client, String sensorTopic): mqttClient(client)
【问题讨论】:
-
PubSubClient(wifiClient);创建一个新对象,然后将其复制或移动到成员变量中。当构造函数完成时,原始的被销毁 -
这取决于
PubSubClient::operator=(PubSbuClient const&)的实现。也许有共享资源? -
如果这对您来说是个问题,这只是 favor member initializer lists 在 c'tor 中过度分配的另一个原因。
-
不,请不要。在超过 300 的声誉下,您应该非常清楚有关您的问题的重要细节(如代码)属于帖子正文,而不是 cmets。 edit 代码进入你的问题。
-
没有minimal reproducible example 这个问题不清楚。您发布的代码可能很好也可能不好,具体取决于您未发布的代码。我建议你写一个更小的玩具示例并为此提出相同的问题,因为这里缺少太多内容
标签: c++ object constructor scope