2011-12-23 5 views
5

मेरी कक्षा में मैं दो निजी सदस्य:मैं एक वर्तमान इटरेटर मूल्य के लिए सूचक मिल सकता है

std::list<MyObject> objects; 
MyObject *selecteObj; 

कोई घटना होती है जब मैं सूची के माध्यम से पुनरावृति और परीक्षण के कुछ प्रकार को चलाने के लिए है कि होगा चाहते हैं केवल सूची में से किसी एक आइटम पर सच साबित होता है। मैं उस आइटम पर कहीं और उपयोग के लिए एक सूचक को सहेजना चाहता हूं।

std::list<MyObject>::iterator i; 
for (i = objects.begin(); i!=objects.end(); ++i){ 
    if (i->test()) 
     selectedObj = i; 
} 

कहीं और किसी अन्य विधि

if (selectedObj !=null) 
    tmpObj->doSomething(); 

में हालांकि यह काम नहीं करता क्योंकि i एक सूचक नहीं है, इसकी एक इटरेटर भले ही आप यह एक MyObject के लिए सूचक की तरह व्यवहार कर सकते हैं।

क्या पॉइंटर को फिर से प्राप्त करना संभव है कि इटरेटर अन्यत्र उपयोग के लिए आंतरिक रूप से संग्रहीत कर रहा है?

क्या मैं इस गलत तरीके से सोच रहा हूं?

जो मैं करने की कोशिश कर रहा हूं उसे पूरा करने का सही तरीका क्या है?

उत्तर

12

क्या पॉइंटर को फिर से प्राप्त करना संभव है कि इटरेटर अन्यत्र उपयोग के लिए आंतरिक रूप से संग्रहीत हो रहा है?

ज़रूर, बस * साथ इटरेटर भिन्नता और फिर & के माध्यम से वस्तु के लिए एक सूचक मिलती है:

selectedObj = &*i; 

एक तरफ ध्यान दें पर, आप NULL पाश से पहले साथ selectedObj प्रारंभ करने में याद किया?

+1

निश्चित रूप से आपका मतलब है 'std :: addressof (* i)', है ना? ओपी ने नहीं पूछा कि ऑब्जेक्ट के 'एंड' ऑपरेटर को कैसे बुलाया जाए ... –

+0

@ केरेकस्क: मुझे लगता है, आपका मतलब था 'std :: addressof' ('std :: address_of' के बजाय), है ना? : पी – Nawaz

+0

@ नवाज: ओह, मैंने क्या कहा *? ;-) –

6

क्या पॉइंटर को पुनः प्राप्त करना संभव है कि इटरेटर अन्यत्र उपयोग के लिए आंतरिक रूप से संग्रहीत हो रहा है?

हां। के रूप में @FredOverflow ने कहा, ऐसा करते हैं:

selectedObj = &*i; 

हालांकि, अगर आप सी 11 ++ की सुविधाओं का उपयोग कर सकते हैं, तो आप बेहतर रेंज आधारितfor पाश का उपयोग कर वाक्य रचना लेखन का आनंद ले सकते हैं:

MyObject *selectedObj = NULL; 
for (MyObject & obj : objects) 
{ 
    if (obj.test()) 
     selectedObj = &obj; //store the address 
} 

बेहतर दिखता है? &*i जैसे इटेटरेटर और सिंटैक्स लिखने की कोई ज़रूरत नहीं है। यह भी ध्यान दिया जाना चाहिए कि यदि MyObject वर्ग operator & अधिभारित किया गया है, तो &*i काम नहीं करेगा, क्योंकि यह आपको ऑब्जेक्ट का पता प्राप्त करने के बजाय operator& फ़ंक्शन का आह्वान करेगा! यदि हां, तो फिर तुम (MyObject*)&(char&)*i लिखने *i का पता पाने के लिए है, या सी ++ 11 में आप std::addressof(*i) उपयोग कर सकते हैं अगर आप सी ++ 11 उपयोग नहीं कर सकते जो आप अपने आप को परिभाषित कर सकते हैं:

template< class T > 
T* addressof(T& arg) { 
    return (T*)&(char&)arg; 
} 

कोड से लिया यहां: std::addressof

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