12

これが可能かどうか知りたいのですが。私は機能を持っています:

 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に正しいティックを与えました。

4

2 に答える 2

13

はい、makeShared()メソッドを使用します。

于 2012-05-17T22:44:31.053 に答える
9

これは古いもので、おそらく OP にはもう役に立たないことはわかっていますが、他のユーザーがこれに出くわす可能性があります。次のようにすることをお勧めします。

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

ジョナソンの答えが危険である理由は、 Pointcloud::Ptr が、指定されたオブジェクトの所有権を意味する boost::shared_ptr の typedef であるためです。ただし、彼の回答では、オブジェクトは実際にはローカル変数であり、参照が残っている間にスコープ外になる可能性があり、shared_ptr が最終的に削除を呼び出すことを意味します。これは未定義の動作です。

一方、make_shared() を使用すると、クラウドがディープ コピーされます。プログラムは正しく動作しますが、追加のコピーが必要ない場合は、最適とは言えません。

于 2017-07-20T15:57:29.907 に答える