2013-05-06 11 views
6

मैं सबसे अच्छा तरीका है यह पता लगाने की एक सदिश अभी बनाया गया है कि और सदस्य चर वेक्टर को जोड़ा गया में एक तत्व के लिए सूचक धारण करने के लिए कोशिश कर रहा हूँ करने के लिए एक सूचक रिटर्निंग:एक वेक्टर तत्व

SceneGraphNode* addChild(std::string name){ 
    SceneGraphNode child(this,name); 
    m_children.push_back(child); 
    return &child; 
} 

संकलक सही ढंग से मुझे चेतावनी देता है क्योंकि मैं ढेर पर बनाए गए किसी ऑब्जेक्ट का पता वापस कर रहा हूं, और यह कार्य समाप्त होने के बाद उस वस्तु को दायरे से बाहर कर देगा। हालांकि, ऑब्जेक्ट vector में रहता है, है ना?

तो, क्या मुझे चेतावनी को अनदेखा करना चाहिए या ऐसा करने का एक बेहतर तरीका है?

उत्तर

10

हालांकि, ऑब्जेक्ट वेक्टर में रहता है, है ना?

नहीं, इसकी एक प्रति करता है। आप प्रतिलिपि का पता वापस करना चाहते हैं।

return &m_children.back(); 

हालांकि, वेक्टर में रहने वाले किसी ऑब्जेक्ट को पॉइंटर स्टोर करना अच्छा नहीं है। क्योंकि जब वेक्टर को फिर से आवंटित करने की आवश्यकता होती है, तो सूचक को अमान्य कर दिया जाएगा। शायद आपको अपने वेक्टर में पॉइंटर्स (अधिमानतः स्मार्ट पॉइंटर्स) स्टोर करना चाहिए।

उदाहरण के लिए:

// in your class 
std::vector<std::unique_ptr<SceneGraphNode>> m_children; 

SceneGraphNode* addChild(std::string name) 
{ 
    std::unique_ptr<SceneGraphNode> child(new SceneGraphNode(this,name)); 
    m_children.push_back(std::move(child)); 
    return m_children.back().get(); 
} 
+0

अच्छे अंक, वेक्टर में स्मार्ट पॉइंटर संग्रहीत करने के विचार के लिए – johnbakers

+0

+1 धन्यवाद। – taocp

+0

हां, मैं 'std :: vector > m_children का उपयोग करने जा रहा हूं; 'इसके बजाय – johnbakers

0

हालांकि, वस्तु पर वेक्टर में, सही रहता है?

जब आप वेक्टर में धक्का, यह वास्तव में, वस्तुओं की copies धक्का, नहीं वस्तु ही वेक्टर में। एसटीएल कंटेनर copy in, copy out करता है। हालांकि, जैसा कि संकलक द्वारा इंगित किया गया है, आपको return the address of an object created on the stack नहीं होना चाहिए।

0

इसे std :: वेक्टर में जोड़ते समय, आप अनिवार्य रूप से एक प्रतिलिपि कर रहे हैं। आपको वेक्टर में संग्रहीत ऑब्जेक्ट का संदर्भ वापस करना चाहिए।

return &(m_children.back()); 
+0

वाह, यह मुझे आश्चर्यचकित करता है, लेकिन मुझे वास्तव में ब्रैकेट्स को पहली बार पढ़ने में मुश्किल होती है। – chris

0

वस्तु वास्तव में वेक्टर में पर रहते नहीं करता, क्योंकि जब आप push_back यह ing, तो आप इस तत्व की प्रतिलिपि बना रहे हैं।

अगर आप (रयान के रूप वास्तव में और अधिक सरल हो जाएगा) ऐसा ही कुछ करके वापसी बदल इस कोड काम कर सकता था:

return &m_children[m_children.size() - 1]; 

इस तरह, आप प्रभावी रूप से एक सूचक एक तत्व पर अपना सदिश में रहने वाले लौट रहे हैं ।

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