我想知道这是否可行。我有一个功能:
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正确的勾号,这次是他第一次进入。
答案 0 :(得分:12)
是的,使用makeShared()方法。
答案 1 :(得分:6)
我知道这是旧的,可能不再使用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()深度复制云。该程序将正常工作,但如果你不需要额外的副本,它远非最佳。