2012-06-20 10 views
5

मैं जानना चाहता हूं कि ये मूल रूप से एक ही चीज़ हैं या नहीं।एक सी ++ कन्स्ट्रक्टर के संदर्भ पास करना और संदर्भ या गैर-संदर्भ प्रकारों को सहेजना

class ExampleClass { 
    public: 
     ExampleClass(Object& newObj) : obj(newObj) {} 
    private: 
     Object obj; 
} 

class ExampleClass2 { 
    public: 
     ExampleClass2(Object& newObj) : objReference(newObj) {} 
    private: 
     Object& objReference; 
} 

तो क्या यह कक्षाओं में से किसी के साथ काम नहीं करेगा?

ExampleClass* getExampleObject() { 
    Object obj; 
    return new ExampleClass(obj); 
} 

ExampleClass2* getExample2Object() { 
    Object obj; 
    return new ExampleClass2(obj); 
} 

void main() { 
    ExampleClass* ec = getExampleObject(); 
    ExampleClass2* ec2 = getExample2Object(); 
    //Do something involving the member objects of ec and ec2 
} 

तो क्या सदस्य वस्तुएं getExampleObject विधियों दोनों के बाद अमान्य हैं? क्या exampleClass का निर्माता अपने कन्स्ट्रक्टर में संदर्भित ऑब्जेक्ट की एक प्रति सहेजता नहीं है?

+1

आपका कोड संकलित नहीं करता है, क्योंकि आप पॉइंटर्स असाइन नहीं कर सकते हैं (जैसा कि getExampleObject और getExample2Object द्वारा लौटाया गया है) गैर-पॉइंटर चर इको और ec2 पर। – SirDarius

+0

हाँ, मुझे खेद है, मैं * भूल गया था। – user1468729

उत्तर

8

ExampleClass ठीक है, क्योंकि यह इसके कन्स्ट्रक्टर तर्क में संदर्भित ऑब्जेक्ट की प्रतिलिपि लेता है।

ExampleClass2 उस वस्तु अपने निर्माता तर्क में संदर्भित ExampleClass2 उदाहरण के जीवनकाल के लिए मौजूद हैं (क्योंकि यह ऑब्जेक्ट के संदर्भ संग्रहीत करता है, यह इसे कॉपी नहीं करता है) की आवश्यकता है। यदि ऐसा नहीं होता है, तो ExampleClass2 उदाहरण के रूप में जल्द ही ऑब्जेक्ट को संदर्भित करने के लिए एक खतरनाक संदर्भ होगा। getExample2Object() फ़ंक्शन obj के साथ getExample2Object() रिटर्न के साथ यह मामला नष्ट हो गया है।

+1

धन्यवाद। मैंने यही सोचा लेकिन इसने मुझे खुद को संदेह किया: [लिंक] (http://stackoverflow.com/questions/1404305/c-reference-in-constructor) – user1468729

+0

@ user1468729, उस प्रश्न में 'myclass' 'std :: स्ट्रिंग 'सदस्य,' std :: string' का संदर्भ नहीं है। – hmjd

+0

तो मेरा पहला उदाहरण क्लास करता है। या मुझसे यहां कुछ छूट रहा है? – user1468729

0

मैं जानना चाहता हूं कि ये मूल रूप से एक ही चीज़ हैं या नहीं।

नहीं, वे नहीं हैं। Example का कन्स्ट्रक्टर ऑब्जेक्ट संदर्भ लेता है और ऑब्जेक्ट पास करने के लिए सदस्य ऑब्जेक्ट बनाता है। यह वस्तु संदर्भ नहीं बल्कि एक प्रति है। Example2 के मामले में, आप वास्तव में objReference बना रहे हैं ctor के पैरामीटर में पारित वस्तु का संदर्भ लें। आप केवल newObj के जीवनकाल तक अच्छे हैं।

Object obj; 
return new ExampleClass2(obj); 

क्लासिक मामले में जब यह विफल हो जाएगा है। एक बार फ़ंक्शन लौटने के बाद, आपके पास एक खतरनाक संदर्भ होगा।

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