Когда я попадаю в библиотеку облаков точек (PCL), я сталкиваюсь с некоторой путаницей в отношении того, когда объявлять облака точек с ::Ptr
стихами без этого.
Кажется, что это работает в любом случае, напримеробе эти программы компилируют, запускают и производят ожидаемые результаты (записывая в файл случайное облако из 20 точек):
// WriteCloud.cpp
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
int main(void)
{
std::cout << "\n\n" << "starting program" << "\n\n";
pcl::PointCloud<pcl::PointXYZ> cloud; // !!! without ::Ptr !!!
int numPoints = 20;
for (int i = 0; i < numPoints; i++)
{
pcl::PointXYZ point;
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points.push_back(point);
}
// for simplicity, use an "unorganized" cloud, "width" = num points, "height" = 1
cloud.width = (int)cloud.points.size();
cloud.height = 1;
pcl::io::savePCDFileASCII("my_cloud.pcd", cloud);
std::cout << "\n\n" << "program complete" << "\n\n";
return (0);
}
и
// WriteCloudPtr.cpp
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
int main(void)
{
std::cout << "\n\n" << "starting program" << "\n\n";
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // !!! with ::Ptr !!!
int numPoints = 20;
for (int i = 0; i < numPoints; i++)
{
pcl::PointXYZ point;
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points.push_back(point);
}
// for simplicity, use an "unorganized" cloud, "width" = num points, "height" = 1
cloud->width = (int)cloud->points.size();
cloud->height = 1;
pcl::io::savePCDFileASCII("my_cloud.pcd", *cloud);
std::cout << "\n\n" << "program complete" << "\n\n";
return (0);
}
Существует ли эмпирическое правило какдля чего следует использовать?Более конкретно, вот несколько вопросов, которые у меня есть:
-Во всех примерах PCL GitHub https://github.com/PointCloudLibrary/pcl/tree/master/examples программы используют ::Ptr
, и на веб-сайте большинство (но не все) примеровиспользуйте ::Ptr
.Кроме того, по большей части примеры, которые я нашел без использования ::Ptr
, кажутся очень старыми.Исходя из всего этого, у меня сложилось впечатление, что ::Ptr
обычно считается текущим стандартом PCL, верно ли это?
- Способ не ::Ptr
кажется более простым, есть ли недостатокне-1021 * способ, который не очевиден?Прежде чем кто-то скажет, что «передача их в функцию создаст копию облака и, следовательно, будет неэффективной», я хотел бы перейти по ссылке, чтобы не делать копий без необходимости.
-Clearly ::Ptr
является typedef (по существупереименование) boost::shared_ptr
.Тем не менее, мне неудобно использовать указатели, когда в этом нет необходимости, поскольку в странных ситуациях могут происходить забавные вещи.Например, в принятом ответе на этот пост Создание pcl :: PointCloud :: Ptr из pcl :: PointCloud упоминается странная ситуация преобразования, которая может вызвать сбой.Существуют ли риски, связанные с использованием способа ::Ptr
в определенных ситуациях, о которых должны знать пользователи PCL?