C++ C++;在构造函数中安装对象时类成员范围

C++ C++;在构造函数中安装对象时类成员范围,c++,object,constructor,scope,C++,Object,Constructor,Scope,我在类构造函数中有以下代码: MqttSensorInterface::MqttSensorInterface(Client& client, String sensorTopic) { this->mqttClient = PubSubClient(client); this->sensorTopic = sensorTopic; this->askMeasureTopic = sensorTopic + "/askmeasure";

我在类构造函数中有以下代码:

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)

当构造函数的主体

MqttSensorInterface::MqttSensorInterface(String sensorTopic)
{
  WiFiClient wiFiClient;
  this->mqttClient = PubSubClient(wifiClient);
  this->sensorTopic = sensorTopic;
  this->askMeasureTopic = sensorTopic + "/askmeasure";
  this->publishMeasureTopic = sensorTopic + "/measure";
}
获取已使用默认构造函数
PubSubClient
创建数据成员mqttClient的控件,前提是在类定义中没有该数据成员的显式初始值设定项

所以在这个声明中,在身体内部

this->mqttClient = PubSubClient(wifiClient);
通过构造函数
PubSubClient(wifiClient)
的显式调用,创建了类型为
PubSubClient
的临时对象,并使用复制分配运算符或移动分配运算符将此临时对象分配给数据成员
this->mqttClient
。在语句执行结束时,临时对象被销毁


如果可能,您可以在构造数据成员期间在构造函数的mem初始值设定项列表中初始化数据成员。

当构造函数的主体

MqttSensorInterface::MqttSensorInterface(String sensorTopic)
{
  WiFiClient wiFiClient;
  this->mqttClient = PubSubClient(wifiClient);
  this->sensorTopic = sensorTopic;
  this->askMeasureTopic = sensorTopic + "/askmeasure";
  this->publishMeasureTopic = sensorTopic + "/measure";
}
获取已使用默认构造函数
PubSubClient
创建数据成员mqttClient的控件,前提是在类定义中没有该数据成员的显式初始值设定项

所以在这个声明中,在身体内部

this->mqttClient = PubSubClient(wifiClient);
通过构造函数
PubSubClient(wifiClient)
的显式调用,创建了类型为
PubSubClient
的临时对象,并使用复制分配运算符或移动分配运算符将此临时对象分配给数据成员
this->mqttClient
。在语句执行结束时,临时对象被销毁


如果可能,您可以在构造数据成员期间在构造函数的mem初始值设定项列表中初始化数据成员。

PubSubClient(wifiClient)创建一个新对象,然后将其复制或移动到成员变量。当构造函数完成时,原始的将被销毁,具体取决于
PubSubClient::operator=(PubSbuClient const&)
的实现。也许有共享资源?如果这对你来说是个问题,那只是在任务中过度分配任务的另一个原因。不,请不要。在超过300的声誉中,你应该很清楚关于你的问题的重要细节(比如代码)应该在帖子正文中,而不是评论中。将代码输入到您的问题中。如果没有代码,则此问题不清楚。你发布的代码可以是好的,也可以是不好的,这取决于你没有发布的代码。我建议您编写一个较小的玩具示例,并询问相同的问题,因为这里缺少太多的
PubSubClient(wifiClient)创建一个新对象,然后将其复制或移动到成员变量。当构造函数完成时,原始的将被销毁,具体取决于
PubSubClient::operator=(PubSbuClient const&)
的实现。也许有共享资源?如果这对你来说是个问题,那只是在任务中过度分配任务的另一个原因。不,请不要。在超过300的声誉中,你应该很清楚关于你的问题的重要细节(比如代码)应该在帖子正文中,而不是评论中。将代码输入到您的问题中。如果没有代码,则此问题不清楚。你发布的代码可以是好的,也可以是不好的,这取决于你没有发布的代码。我建议您编写一个较小的玩具示例,并询问相同的问题,因为此处缺少太多内容,如果我使用
new PubSubClient(wiFiClient)
,那么它将在明确销毁之前不会被销毁,对吗?@MABC我不明白您的意思。在此语句中,this->mqttClient=PubSubClient(wifiClient);创建了一个临时对象PubSubClient(wifiClient);分配给数据成员的。分配后,临时对象将被销毁。如果改为使用以下语句,则会产生不同的效果
this->mqttClient=PubSubClient(wifiClient)用于此
this->mqttClient=**new**PubSubClient(wifiClient)?MABC:这些不是等效的,所以,是的,有区别,但可能不是您想要的差异。做出决定,这样我们就可以得到我们需要的所有信息。@MABC当然有区别。如果使用运算符new,则第二种情况无效,因为此->mqttClient不是指针,是吗?如果我使用
new PubSubClient(wiFiClient)
,则在显式销毁之前它不会被销毁,对吗?@MABC我不明白您的意思。在此语句中,this->mqttClient=PubSubClient(wifiClient);创建了一个临时对象PubSubClient(wifiClient);分配给数据成员的。分配后,临时对象将被销毁。如果改为使用以下语句,则会产生不同的效果
this->mqttClient=PubSubClient(wifiClient)用于此
this->mqttClient=**new**PubSubClient(wifiClient)?MABC:这些不是等效的,所以,是的,有区别,但可能不是您想要的差异。做出决定,这样我们就可以得到我们需要的所有信息。@MABC当然有区别。第二种情况是,如果使用了运算符new,则无效,因为此->mqttClient不是指针,是吗?