2010-12-28 19 views
11

मुझे एक कक्षा लिखने की आवश्यकता है जिसका निर्माता किसी ऑब्जेक्ट का निरंतर संदर्भ लेता है और इसे स्थानीय रूप से संग्रहीत करता है।सी ++: गैर अस्थायी कॉन्स संदर्भ

सबसे आम गलतियों से बचने के लिए मैं पूर्ववत कर सकता हूं, मैं केवल अस्थायी (यानी: lvalues ​​के संदर्भ) के संदर्भ स्वीकार करना चाहता हूं।

मैं एक ऐसा फ़ंक्शन कैसे लिख सकता हूं जो केवल अस्थायी संदर्भों को निरंतर संदर्भित करता हो?


पाठ्यक्रम भी एक गैर अस्थायी क्षेत्र से बाहर जाने के लिए और इस प्रकार मेरी कक्षा व्यवहार बाधित कर सकता है के

, लेकिन मुझे विश्वास है कि अस्थायी संदर्भ अनुमति न देने से मैं सबसे गलतियों से बचने होगा।

+0

आपको ऐसा क्यों लगता है कि आप इस तरह की अधिकांश गलतियों से बचें? –

+0

ठीक है, जिस वस्तु का संदर्भ मुझे पास करने की आवश्यकता है उसे तुरंत चालू करने के बाद उपयोग करने की आवश्यकता नहीं है (यानी: मैं बस ऑब्जेक्ट को तुरंत चालू करता हूं और इसे पास करता हूं, इस प्रकार मेरी कोड शैली के कारण मैं इसे स्टैक पर तुरंत नहीं चालू करता)। अगर मैं भूल जाता हूं कि अन्य वर्ग के निर्माता को _permanent_ मान की आवश्यकता है, अस्थायी अस्वीकार (यानी: संकलित समय त्रुटि) को देखते हुए मुझे याद आएगा, मुझे उम्मीद है। – peoro

उत्तर

18

आप एक संदर्भ की दुकान और निर्माता पूरा कर लिया है के बाद यह उपयोग करने की आवश्यकता करने जा रहे हैं, यह शायद निर्माता के लिए सबसे अच्छा एक सूचक लेने के लिए है:

struct C { 
    C(const X* p) : p_(p) { } 

    const X* p_; 
}; 

इस तरह, यह बहुत ज्यादा है कि आप गारंटी है अस्थायी को पॉइंटर नहीं होगा (जब तक X कुछ वास्तव में गूंगा नहीं करता है,को this वापस करने के लिए ओवरलोडिंग की तरह)।

यदि निर्माता एक सूचक लेता है, तो यह कक्षा के उपयोगकर्ताओं के लिए भी स्पष्ट है कि उन्हें X ऑब्जेक्ट के जीवनकाल पर ध्यान देने की आवश्यकता है जो वे कन्स्ट्रक्टर को पास करते हैं।

+4

स्वच्छ और स्मार्ट समाधान! –

+1

हाँ, सहमत, स्वच्छ और स्मार्ट समाधान! मैं यह भी कहूंगा कि 'पी' शून्य नहीं है, और इसे संदर्भ के रूप में संग्रहीत करेगा। – peoro

+0

सहमत हैं, ओपी को सीखना चाहिए कि पॉइंटर्स बेहतर हैं! केवल जब आप बिल्कुल (उदाहरण के लिए प्रतिलिपि बनाने वाले) में संदर्भों का उपयोग करें। – Yttrill

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