【问题标题】:Can't set values in an std::map<std::string,std::shared_ptr<class>>无法在 std::map<std::string,std::shared_ptr<class>> 中设置值
【发布时间】:2017-05-09 18:15:34
【问题描述】:

我正在尝试制作一个如本文标题所示的地图,以将某些低音类链接到 MQTT 主题标题。

我已经开始使用原始(c 风格)指针,但正如我在学校学到的那样,智能指针将是更好的设计选择。

实例化地图时不会出现问题,但是当我要为其分配数据时。

我让它完美运行的方式是:

std::map<std::string,sensors*> factory;
factory["sensorTwo"]= new sensor1;

在这段代码中,“sensors”是sensor1的基类;

当我尝试这样做时:

std::map<std::string,std::shared_ptr<sensors>> factory;
factory["sensorOne"]= std::make_shared<sensors> (sensor1);

编译器在 ';' 之前要求一个主表达式在第二行。 第一个示例中的分配显然不适用于 shared_ptr,但有人知道如何做到这一点吗?

主要如下:

#include <string>
#include <memory>
#include <map>

#include "sensors.h"
#include "sensor1.h"
#include "sensor2.h"


int main()
{
    //std::map<std::string,sensors*> factory;

    std::map<std::string,std::shared_ptr<sensors>> factory;
    factory["sensorOne"]= std::make_shared<sensor1> ();
    return 0;
}

【问题讨论】:

  • 如果我们不知道您的三个 *.h 文件中的内容,那么查看您的 main 并没有多大帮助。
  • MQTT 无法解释。要么没用(所以应该删除),或者需要解释。
  • Christian,这些文件几乎是空的,只是空类,其中编号的是传感器的派生类。 Yakk,这对解决方案并不重要,只是说明我为什么要这样的一个小背景。
  • @Xinq:如果它们几乎是空的,那么在没有它们的情况下创建 MCVE 应该会更容易,可能通过将 sensors 类和 #include &lt;map&gt; 的定义直接移动到 @ 987654330@.

标签: c++ class c++11 shared stdmap


【解决方案1】:

假设您已声明结构 FooBar,如下所示:

struct Foo {};
struct Bar : Foo {};

使std::shared_ptr&lt;Foo&gt; 指向Bar 实例的std::make_shared 的正确语法是:

std::shared_ptr<Foo> sp = std::make_shared<Bar>();

在您的第一个示例中,FoosensorsBarsensor1。所以你的代码不应该是:

factory["sensorOne"]= std::make_shared<sensors> (sensor1);

但是:

factory["sensorOne"]= std::make_shared<sensor1> ();

【讨论】:

  • 你是否也知道如何从内存中删除对象? (单个,如果可能,也可以在循环中动态地)
  • 由于您使用的是智能指针,因此您不必管理删除:当最后一个指向它的share_ptr 被销毁时,内存将被释放
  • 啊,我明白了。感谢您的帮助!
【解决方案2】:

您缺少对 &lt;map&gt; 的包含,这可能会导致此错误消息。

【讨论】:

  • @einpoklum 实际上,这看起来像是解释错误的可能性。 OP的例子不是minimal reproducible example,所以大家基本都是猜的。
  • @Yakk 那么错误不会出现在第一行而不是第二行吗?
  • 我确实忘记在帖子中包含它,但我确实将它包含在 main.cpp 中
  • @Xinq:这就是为什么需要 MCVE。永远不要发布你之前没有测试过的代码。
  • @Yakk:你说得对,这只是一个猜测,我基本上是建议 didiz 将这些猜测作为评论。顺便说一句 - 感谢您撤消您的反对票:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2014-08-06
  • 2014-06-08
  • 2012-03-04
相关资源
最近更新 更多