【问题标题】:Create a pcl::PointCloud::Ptr from a pcl::PointCloud从 pcl::PointCloud 创建 pcl::PointCloud::Ptr
【发布时间】:2012-05-25 13:03:16
【问题描述】:

我想知道这是否可能。我有一个功能:

 pcl::PointCloud<pcl::PointXYZRGB> createPointCloud(std::Vector<Nodes> input)

返回一个点云。我想知道是否可以获取这个点云,并制作一个指向它的副本的指针。 pcl 像这样指向云:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>)

我试过这样做:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(createPointCloud(nodeList))

这会导致一个非常明显的错误,即。 createPointCloud 不返回指向云的指针。

我也试过这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR = &createPointCloud(nodeList)

还有这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(&createPointCloud(nodeList))

这会导致编译错误:“获取临时地址”

是让函数返回指针类型的唯一选择,还是有办法按照我的要求做?

编辑:

以下两个答案都是正确的,我已经授予 Jonathon 正确的勾号,因为他这次是第一个。

【问题讨论】:

    标签: c++ pointers point-cloud-library


    【解决方案1】:

    是的,使用makeShared() 方法。

    【讨论】:

    • 他没有使用 std::shared_ptr。他正在使用特定于库的 RAII ptr 类。 std::make_shared() 将无法使用它。
    • @johnathon 我在哪里提到 std:: 什么?点击链接。
    • 这可能也有效,不过我使用了@jonathon 的答案。
    • Ptr pcl::PointCloud::makeShared 不是 make_shared(),因此是对标准库的引用。
    • 非常容易理解@jonathon,感谢您的输入,它们都是同样正确的答案,我应该给谁打勾?
    【解决方案2】:

    我知道这是旧的,可​​能对 OP 不再有用,但其他用户可能会偶然发现它。我建议这样做:

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>);
    *cloudPTR = createPointCloud(nodeList);
    

    Jonathon 的回答很危险的原因是 Pointcloud::Ptr 是 boost::shared_ptr 的 typedef,这意味着指向对象的所有权。然而,在他的回答中,该对象实际上是一个局部变量,这意味着它可能会超出范围而仍有对其的引用,并且 shared_ptr 最终将对其调用 delete,这是未定义的行为。

    另一方面,使用 make_shared() 对云进行深度复制。该程序可以正常运行,但如果您不需要额外的副本,那么它远非最佳。

    【讨论】:

    • 这个需要包含哪个pcl头文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2017-12-08
    • 2020-07-31
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多