【问题标题】:What is going on in this object initialization?这个对象初始化发生了什么?
【发布时间】:2018-06-06 06:35:02
【问题描述】:
MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);

与更传统的client(mqttNetwork); 或类似MQTTNetwork *mqttNetwork = new mqttNetwork(); 相比,有人可以解释这里正在做什么吗?

我还试图完成的是将该行代码修改为我可以类似于MQTTNetwork *mqttNetwork = new mqttNetwork(); 进行初始化的内容,以便我可以从循环内部为指针分配一个新对象,因为将使用此代码在具有无限循环的嵌入式应用程序中,对象需要在循环迭代之间持续存在。

【问题讨论】:

  • client(mqttNetwork); 比 client(mqttNetwork); 更传统吗?
  • 因为它前面有整个MQTT::Client&lt;MQTTNetwork, Countdown&gt; 部分,我无法弄清楚它的含义。
  • 这就是你要声明的变量的类型,就像MQTTNetwork* 是mqttNetwork 的类型一样。顺便说一句,您使用指针和手动内存分配的理由是没有实际意义的。您不需要指针即可分配新对象。大大简化了,但原则上是一样的,你也不需要指针来做类似int a=3; a = 5;
  • 关于不需要使用指针的好处,我想我有点累了。无论如何,感谢您和 KorbenDose 的回答,这个问题现在变得更加清晰。
  • client(mqttNetwork); 将是语法错误(除非 client 已定义)

标签: c++ oop mqtt


【解决方案1】:

嗯,上面提到的方法和指针方法的基本区别在于,指针分配在堆上,而对象client 位于堆栈上。

如果client在循环内被定义和初始化,则每次循环后都会调用析构函数,并且每次都会重新创建对象。

由于对象需要在循环迭代之间持续存在,client 可能在循环之外定义。在这种情况下,您可能需要查找您使用的库是否提供了 clear() 或 reset() 函数以及将新数据填充到对象中的方法。这样您就可以一直使用同一个对象并分配新数据。

注意:如果您使用的是指针方法并且如果可能的话,我会考虑使用智能指针。

【讨论】:

  • 智能指针似乎非常有用,以前从未听说过它们。无论如何,你能解释一下MQTT::Client&lt;MQTTNetwork, Countdown&gt; 部分的作用吗?此外,由于我正在尝试做的事情,如果发生某种情况,我偶尔需要从循环中创建一个全新的客户端对象 - 库没有重置或类似功能。因此,我希望在循环之外定义指针,以便我可以为其分配新对象。
  • 我不确定您对模板的熟悉程度,但看看它可能是个好主意(例如here oder here)。 MQTT::Client&lt;MQTTNetwork, Countdown&gt; 基本上只是定义了模板的特定实例化,模板参数为MQTTNetwork 和Countdown。
  • 好吧,我根本不熟悉它们。这样就更清楚了!
【解决方案2】:

为第一个问题提供答案:MQTT::Client&lt;MQTTNetwork, Countdown&gt; client(mqttNetwork); 在概念上与std::vector&lt;double&gt; numbers(10) 或std::unordered_map&lt;int, double&gt; myMap(otherMap.begin(), otherMap.end()); 相同

第一部分只是你要构造的对象的类型,它恰好是一个模板类型(就像std::vector),因此需要你拼出模板参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多