2011-01-27 11 views
20

इस कोड नमूना पर विचार करें:क्या सी ++ में अभी तक निर्मित ऑब्जेक्ट के संदर्भ को बाध्य करना सुरक्षित है?

class Base { 
public: 
    Base(string& _object) : object(_object) {} 
private: 
    string& object; 
}; 

class Derived: public Base { 
public: 
    Derived() : Base(object) {} 
private: 
    string object; 
}; 

जाहिर है पहले Base का निर्माण किया गया है और इसे अभी तक निर्मित ऑब्जेक्ट का संदर्भ नहीं दिया गया है।

मेमोरी को पूरे Derived ऑब्जेक्ट के लिए आवंटित किया गया है, इसलिए Derived::object कानूनी रूप से सुलभ मेमोरी में है, बस इसका कन्स्ट्रक्टर नहीं चला है। Base::Base() पास ऑब्जेक्ट के किसी भी तरीके को कॉल नहीं करता है, केवल संदर्भ संग्रहीत करता है। यह विजुअल सी ++ 9 में काम करता है। Xzx33

क्या यह सी ++ मानक के अनुसार सुरक्षित है?

+0

अच्छा सवाल। मैंने इसे अपनी परियोजना में से एक में किया है, और यह ठीक काम कर रहा है; किसी भी समस्या को कभी नहीं देखा। लेकिन मैं जानना चाहता हूं कि यह "सुरक्षित" है या नहीं। मानक से उद्धरण के लिए – Nawaz

उत्तर

19

यह तब तक सुरक्षित है जब तक आप वस्तु का निर्माण करने से पहले संदर्भ का उपयोग नहीं करते हैं। आप base-from-member idiom का प्रयोग कर एक (निजी) आधार वर्ग जो बेस से पहले आता है में वस्तु को स्थानांतरित करने, और इस तरह बेस से पहले निर्माण किया जा सकता है, यदि आप निर्माण के क्रम को बदलने की जरूरत:

struct Base { 
    Base(string &ref) { 
    cout << "imagine the ctor uses the ref: " << ref; 
    } 
}; 

struct DerivedDetail { 
    DerivedDetail(string const &x) : object (x) {} 
    string object; 
}; 

struct Derived : private DerivedDetail, Base { 
    Derived() : DerivedDetail("foobar"), Base(object) {} 
    // In particular, note you can still use this->object and just 
    // ignore that it is from a base, yet this->object is still private 
    // within Derived. 
}; 

सी ++ 03 §3.8p6:

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

संक्षेप में: किसी भी सदस्य, विधियों तक पहुंच न करें, या जो कुछ भी करता है उसे पास न करें। आप इसका पता ले सकते हैं और इसके संदर्भों को बांध सकते हैं।

+0

+1! – Nawaz

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

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