2012-05-17 4 views
7

Я хотел бы знать, возможно ли это. У меня есть функция:Создайте pcl :: PointCloud :: Ptr из pcl :: PointCloud

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

, который возвращает облако точек. Я хотел бы знать, можно ли взять это облако точек и сделать указатель на его копию. ПКЛ делает указатели на облака, как это:

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)) 

И это приводит к ошибке компиляции: "принимая адрес временного"

Это единственный вариант есть функция, возвращающая тип указателя или есть способ делать то, что я прошу?

EDIT:

Оба приведенных ниже ответов являются правильными, я присудили Джонатон правильный клеща, как он попал в этот раз впервые.

ответ

10
pcl::PointCloud<pcl::PointXYZRGB> m_cloud = createPointCloud(nodeList); 
pcl::PointCloud<pcl::PointXYZRGB>::Ptr m_ptrCloud(&m_cloud); 

Это то, что вы должны делать, тогда это сработает.  

+0

Хороший звонок, это правильно. –

+0

@Ben да, он тоже сделал. Любой из этих методов должен работать, в зависимости от того, как вы возвращаете свой класс из своей функции. Какой компилятор вы используете? – johnathon

+0

cmake, поэтому im предположение g ++ –

10

Да, используйте метод makeShared().

+0

он не использует std :: shared_ptr. он использует библиотечный класс RAII ptr. std :: make_shared() не будет работать с ним. – johnathon

+1

@johnathon Где я упоминал std :: anything? Перейди по ссылке. – ergosys

+1

Исправлено неправильное обращение. Боже, ребята, ссылка правильная. – ergosys

1

Я знаю, что это старый и, вероятно, больше не используется для ОП, но другие пользователи могут наткнуться на него. Я бы предложил сделать это следующим образом:

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

Надеемся, что назначение будет оптимизировано по возврату.

Причина, по которой ответ Джонатона опасен, заключается в том, что Pointcloud :: Ptr - это typedef для boost :: shared_ptr, который подразумевает право собственности на объект, на который указывает. Однако в его ответе объект фактически является локальной переменной, означающей, что он может выйти из области видимости, пока есть ссылки на него, и что shared_ptr в конечном итоге вызовет на нем удаление, что является неопределенным поведением.

Использование make_shared(), с другой стороны, глубоко копирует облако. Программа будет работать правильно, но если вам не нужна дополнительная копия, она далека от оптимальной.

+0

Это должен быть принятый ответ –

Смежные вопросы