2013-02-11 4 views
38

किसी ऑब्जेक्ट का पता लेते समय मुझे के बजाय addressof(x) की आवश्यकता है या नहीं?और x के बजाय पता (x) का उपयोग कब करें?


लगता सवाल की तरह भ्रामक था, तो एक स्पष्टीकरण क्रम में है:

addressof स्पष्ट रूप से अतिभारित पते-के ऑपरेटर को नजरअंदाज। मुझे पहले से ही पता है।

क्या मैं जानना चाहता हूँ है:
मुझे कैसे पता चलेगा कि क्या मैं वास्तव में क्या करना चाहते हैं यह है कि करते हैं? (खासकर जब एक टेम्पलेट के अंदर, आदि)

वहाँ मुझे यह पता लगाने जब मैं addressof बजाय & जरूरत है मदद करता है कि "नियम" किसी तरह का है?
आखिरकार, वे दोनों ऑब्जेक्ट का "पता" वापस कर देते हैं, तो मैं किसका उपयोग करता हूं?

उत्तर

52

आप std::addressof का उपयोग करते समय करते हैं। अफसोस की बात है, "जब आपको" जब भी आप टेम्पलेट कोड में काम कर रहे हों, तब भी शामिल है और अज्ञात प्रकार T या T& के चर को उस परिवर्तनीय स्मृति में ईमानदार-से-ईश्वर सूचक में बदलना चाहते हैं।

क्योंकि सी ++ कमेटी ने स्पष्ट रूप से संदर्भ ऑपरेटर (थोड़ा वैध उद्देश्य के लिए) को अधिभारित करने की अनुमति दी है, तो उपयोगकर्ता के लिए आपके टेम्पलेट को किसी प्रकार के साथ तुरंत चालू करना संभव है कि आप वास्तविक संकेतक प्राप्त करने के लिए संदर्भ ऑपरेटर का उपयोग नहीं कर सकते सेवा मेरे। std::addressof उन उपयोगकर्ताओं के आस-पास काम करने का एक तरीका है जो इस संदिग्ध सी ++ सुविधा का उपयोग करते हैं ताकि भाषा को शुरू करने के लिए काम करने की गारंटी हो।

संक्षेप में, यह एक भाषा मूर्खता के लिए एक पुस्तकालय तय है। यदि आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता आपका कोड तोड़ नहीं सकते हैं तो & के बजाय इसे टेम्पलेट कोड में उपयोग करें। यदि आपके उपयोगकर्ताओं को इस आईएल-अनुमानित सुविधा का उपयोग न करने पर भरोसा किया जा सकता है, तो आप & का उपयोग कर सकते हैं।

+4

+1 सबसे अच्छा जवाब मैंने अब तक देखा है, स्थिति को अच्छी तरह से बताता है। – Mehrdad

+1

मुझे मजाकिया लगता है कि * एक * कक्षा I * अपेक्षित * ओवरलोड लोड करने के लिए, 'context_wrapper', प्रतीत नहीं होता है ... – Mehrdad

+1

@Mehrdad: यह मुझे आश्चर्य नहीं करता है; दोनों 'context_wrapper' और 'addressof' बूस्ट से आते हैं। एकेए: वे लोग जो ऑपरेटर को ओवरलोड करने के खतरों को सबसे ज्यादा जानते हैं। –

5

जब आप ऑब्जेक्ट का वास्तविक पता जानना चाहते हैं, तो इसका उपयोग न करें, और operator& ओवरलोड के पते का परिणाम न करें।

+0

क्या ऑपरेटर अधिभार के उद्देश्य को हराने नहीं होगा? – Mehrdad

+0

@ मेहरदाद शायद - लेकिन आप यह चुनने के लिए चुनते हैं कि आप अधिभार चाहते हैं या नहीं। – nos

+0

@ मेहरदद यदि आप अच्छे 'ऑपरेटर' को लागू करने के लिए सभी पर भरोसा करते हैं। –

7

यदि यह उपयोगकर्ता द्वारा परिभाषित प्रकार है जो ओवरलोडेड यूनरी operator& है, और आप इसका पता चाहते हैं, तो addressof का उपयोग करें।

मैं कहूंगा कि आपको हमेशा & का उपयोग करना चाहिए क्योंकि, जैसा कि आप कहते हैं, यदि आप नहीं करते हैं, तो यह ओवरलोड के उद्देश्य को हरा देता है। बेशक बेशक आप ओवरलोड के साथ कुछ सार्थक करते हैं, इस मामले में आपको addressof (कक्षा के बाहर, आप केवल this का उपयोग कर सकते हैं) की आवश्यकता होगी, लेकिन आपको यह सुनिश्चित करना होगा कि आप क्या कर रहे हैं।

यहाँ और भी है - अगर आप कक्षा के बाहर operator& ओवरलोड करना चाहते हैं (आप कर सकते हैं), तो आपको पता लौटने के लिए उपयोग addressof करने के लिए है , अन्यथा यह अनंत प्रत्यावर्तन में जो परिणाम:

struct Class 
{ 
    virtual ~Class() {} 
    int x; 
}; 

void* operator&(const Class& x) 
{ 
    //return &x; <---- infinite recursion 
    return addressof(x) + 4; //I know this isn't safe 
          //but I also know the intrinsics of my compiler 
          //and platform to know this will actually return 
          //the address to the first data member 
} 

मुझे पता है यह सुरक्षित नहीं है।

+0

हालांकि यह ओवरलोडेड ऑपरेटर के उद्देश्य को पूरी तरह से पराजित नहीं करेगा? मैं कैसे बता सकता हूं कि मुझे इसे पराजित करना चाहिए या नहीं? – Mehrdad

+0

@Mehrdad संपादित देखें। –

+0

हम्म, तो यह एक ऐसी स्थिति है जिसमें मैं * पहले * में '& 'का उपयोग नहीं कर सकता, जो सवाल को हल करता है! – Mehrdad

6

मेरी केवल राय:

जब तक आप टीम वर्ग और इसके इंटरफेस डिजाइन करने का हिस्सा हैं, कभी नहीं। मैंने व्यक्तिगत रूप से उस ऑपरेटर को अधिभारित करने का एक अच्छा कारण कभी नहीं देखा है। लेकिन अगर कोई ऐसा वर्ग तैयार करता है जहां यह समझ में आता है, और यह मानते हुए कि कक्षा सार्वजनिक उपभोग के लिए है (जिसका कहना है कि कक्षा केवल एक विशेष पुस्तकालय में आंतरिक उपयोग के लिए नहीं है), तो मैं कक्षा को सामान्य कोड में काम करने की उम्मीद करूंगा स्वाभाविक रूप से उम्मीद है कि & का अर्थ "पता" है। यदि ऑपरेटर ओवरलोड करता है तो वर्ग इस तरह के समझदार तरीके से डिज़ाइन नहीं किया गया है, तो मैं उस वर्ग, अवधि का उपयोग नहीं करता। क्योंकि या तो वह वर्ग टूटा हुआ है, या इसका उपयोग लाइब्रेरी के बाहर नहीं किया जाना चाहिए, जिसका यह हिस्सा है।

4

आखिरकार, वे दोनों वस्तु का "पता" वापस कर देते हैं, तो मैं किसका उपयोग करता हूं?

आप बिल्कुल कोई गारंटी नहीं है कि एक ओवरलोड operator& वस्तु "के पते" है, तो संभावना यह नहीं है कर रहे हैं, या वर्ग लेखक शायद यह ओवरलोड परेशान नहीं होता। वे इसे अलग-अलग प्रकार के लौटने के लिए अधिभारित कर सकते थे, या यहां तक ​​कि void वापस लौटने के लिए अगर वे दुर्भाग्य से लोगों को अपना पता लेने से रोकने की कोशिश कर रहे हैं।

आप एक वस्तु जो हो सकता है& अतिभारित की है, एक सूचक चाहते हैं (उदाहरण के लिए, क्योंकि इसके प्रकार टेम्पलेट पैरामीटर तो तुम्हें पता नहीं है) तो या तो std::addressof या दस्तावेज है कि अपने टेम्पलेट प्रकार का समर्थन नहीं करता का उपयोग जो ऑब्जेक्ट का वास्तविक पता सही प्रकार के रूप में वापस न करें।