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不是指针,是吗?