2012-05-17 21 views
7

बनाएं मुझे यह जानना है कि यह संभव है या नहीं। मेरे पास एक समारोह है:एक पीसीएल :: प्वाइंट क्लाउड :: पीटीआर एक पीसीएल :: प्वाइंट क्लाउड

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

और यह संकलन त्रुटि में परिणाम है:

"अस्थायी का पता लेने के लिए" ही एकमात्र विकल्प है क्या फ़ंक्शन एक पॉइंटर प्रकार लौटाता है या क्या मैं पूछ रहा हूं कि ऐसा करने का कोई तरीका है?

संपादित करें:

नीचे दिए गए उत्तर के दोनों सही हैं, मैं जोनाथन सही टिक से सम्मानित किया है के रूप में वह पहली बार इस समय में मिला है।

उत्तर

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

यही आपको करना चाहिए, फिर यह काम करेगा।  

+0

अच्छी कॉल यह सही है। –

+0

@ बेन हाँ, उसने भी किया। किसी भी विधि को काम करना चाहिए, इस पर निर्भर करता है कि आप अपनी कक्षा से अपने काम को कैसे लौटते हैं। आप किस कंपाइलर का उपयोग कर रहे हैं? – johnathon

+0

सेमेक, तो मैं मानता हूं कि g ++ –

10

हां, makeShared() विधि का उपयोग करें।

+0

वह std :: shared_ptr का उपयोग नहीं कर रहा है। वह लाइब्रेरी विशिष्ट आरएआईआई पीआरटी कक्षा का उपयोग कर रहा है। std :: make_shared() इसके साथ काम नहीं करेगा। – johnathon

+1

@johnathon मैंने std :: कुछ भी कहां दिया? लिंक का पालन करें। – ergosys

+1

गलत गलत वर्तनी। जीज़ आप लोग, लिंक सही है। – ergosys

1

मुझे पता है कि यह पुराना है और शायद ओपी के लिए उपयोग नहीं किया जा सकता है, लेकिन अन्य उपयोगकर्ता इसके ऊपर ठोकर खा सकते हैं। मैं इसे निम्नानुसार करने का सुझाव दूंगा:

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

उम्मीद है कि असाइनमेंट वापसी-मूल्य-अनुकूलित होगा।

जोनाथन का जवाब खतरनाक है कारण यह है कि पॉइंटक्लाउड :: पीआरटी एक बढ़ावा के लिए एक टाइपिफ़ है :: shared_ptr जिसका अर्थ है ऑब्जेक्ट का स्वामित्व इंगित करता है। हालांकि, उनके जवाब में, ऑब्जेक्ट वास्तव में एक स्थानीय चर है जिसका अर्थ यह है कि यह अभी भी संदर्भ के दौरान गुंजाइश से बाहर हो सकता है और साझा_ptr अंततः इसे हटाएगा, जो अपरिभाषित व्यवहार है।

दूसरी तरफ make_shared() का उपयोग क्लाउड की गहरी प्रतियां करता है। कार्यक्रम सही ढंग से काम करेगा, लेकिन अगर आपको अतिरिक्त प्रति की आवश्यकता नहीं है, तो यह इष्टतम से बहुत दूर है।

+0

यह स्वीकार्य उत्तर होना चाहिए –

संबंधित मुद्दे