これが可能かどうか知りたいのですが。私は機能を持っています:
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に正しいティックを与えました。
これは古く、おそらく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()を使用すると、クラウドがディープコピーされます。プログラムは正しく動作しますが、追加のコピーが必要ない場合は、最適とは言えません。
はい、 makeShared() メソッドを使用します。