2012-05-17 14 views
7

Me gustaría saber si esto es posible. Tengo una función:Crear un pcl :: PointCloud :: Ptr desde un pcl :: PointCloud

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

que devuelve una nube de puntos. Me gustaría saber si es posible tomar esta nube de puntos y hacer un puntero a una copia de la misma. pcl hace punteros a las nubes como esto:

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

He intentado hacer esto:

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

Esto resulta en un error decir bastante obvio. createPointCloud no devuelve un puntero a una nube.

También he intentado esto:

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

y esto:

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

y esto se traduce en el error de compilación: "tomar la dirección del temporal"

es la única opción para ¿La función devuelve un tipo de puntero o hay una manera de hacer lo que estoy pidiendo?

EDIT:

Tanto de las respuestas a continuación son correctas, he otorgado Jonathon la garrapata correcta mientras se ponía en primera este momento.

Respuesta

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

Esto es lo que debe hacer, entonces funcionará.  

+0

Buena llamada esto es correcto. –

+0

@Ben sí, él también. Cualquiera de los dos métodos debería funcionar, dependiendo de cómo devuelva su clase desde su función. ¿Qué compilador estás usando? – johnathon

+0

cmake, así que supongo g ++ –

10

Sí, utilice el método makeShared().

+0

él no está usando std :: shared_ptr. él está usando una clase pRa RAII específica de la biblioteca. std :: make_shared() no funcionará con él. – johnathon

+1

@johnathon ¿Dónde mencioné std :: algo? Sigue el link. – ergosys

+1

Error ortográfico corregido. Vaya, chicos, el enlace es correcto. – ergosys

1

Sé que esto es viejo y probablemente ya no sirva para OP, pero otros usuarios pueden tropezar con él. Sugeriría hacerlo de la siguiente manera:

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

Afortunadamente, la asignación será de valor de retorno optimizado.

La razón por la cual la respuesta de Jonathon es peligrosa es que Pointcloud :: Ptr es un typedef para un boost :: shared_ptr que implica la propiedad del objeto apuntado. En su respuesta, sin embargo, el objeto es en realidad una variable local, lo que significa que podría quedar fuera del alcance mientras todavía haya referencias a él y que shared_ptr tardemente llame a eliminar, que es un comportamiento indefinido.

Usando make_shared(), por otro lado, copia profundamente la nube. El programa funcionará correctamente, pero si no necesita la copia adicional, está lejos de ser óptimo.

+0

Esta debería ser la respuesta aceptada –

Cuestiones relacionadas