2014-10-14 17 views
7

निम्नलिखित वर्गों जहां ConcreteBar लागू करता BarIfc को देखते हुए:पासिंग वर्ग के सदस्य

class Base { 

public: 

    Base(BarIfc& bar) : _bar(bar) { } 

    void foo() { 
     _bar.bar(); 
    } 

private: 

    Base(const Base& other); 
    Base& operator=(const Base& other); 

    BarIfc& _bar; // Pure virtual interface 
}; 

class Child : public Base { 

public: 
    // bar is passed to base class before initialization 
    Child(int i) : Base(_bar), _bar(i) { 
    } 

private: 

    Child(const Child& other); 
    Child& operator=(const Child& other); 

    ConcreteBar _bar; 
}; 

मैं सही सोचते हैं कि इस

Child(int i) : Base(_bar), _bar(i) {} 

"वैध" सी ++ के रूप में हूं जब तक मैं उपयोग नहीं कर रहा हूं (उदाहरण के लिए एक विधि बुला रहा है) _bar आधार वर्ग की प्रारंभिक सूची में संदर्भ?

उत्तर

6

धारणा है कि ConcreteBar एक subobject है के तहत

यह मान्य के बाद से भंडारण §3.7.5/1

भंडारण सदस्य subobjects की अवधि के लिए आवंटित किया गया है , बेस क्लास सबोबजेक्ट्स और सरणी तत्व उनकी पूर्ण वस्तु (1.8) का है।

और §3.8/5 कहते हैं:

एक वस्तु का जीवन शुरू किया, लेकिन है इससे पहले कि भंडारण जो वस्तु पर कब्जा आबंटित किया गया है जाएगा या, एक वस्तु के जीवनकाल के बाद के बाद है ऑब्जेक्ट पर कब्जा कर लिया गया ऑब्जेक्ट पर पुनर्स्थापित या रिलीज़ किया गया है, कोई भी सूचक जो स्टोरेज स्थान को संदर्भित करता है जहां ऑब्जेक्ट होगा या स्थित था, लेकिन सीमित तरीके से केवल उपयोग किया जा सकता है। निर्माण या विनाश के तहत एक वस्तु के लिए, 12.7 [गैर स्थिर सदस्य उपयोग की चर्चा करते हुए]

ताकि तक आप संदर्भ का उपयोग नहीं करते के रूप में के रूप में मान्य है देखते हैं।

6

हाँ, यह, मान्य है, क्योंकि जबकि _bar अभी तक निर्माण नहीं किया गया है, भंडारण यह मौजूद है, और यह करने के लिए एक संदर्भ लेने इतने लंबे समय के रूप में आप वास्तव में उस संदर्भ का उपयोग नहीं करते हैं जब तक आप कर रहे हैं ठीक है के लिए व्युत्पन्न वर्ग कन्स्ट्रक्टर बॉडी। , https://stackoverflow.com/a/5905746/4323

और अंत में एक जवाब जो उद्धरण मानक: https://stackoverflow.com/a/6258431/4323 कह रही:

से पहले एक वस्तु का जीवन शुरू कर दिया है लेकिन

यहाँ एक समान विषय आप रोशन पा सकते हैं कि पर एक और पोस्ट स्टोरेज के बाद ऑब्जेक्ट पर कब्जा कर लिया गया है [...], कोई भी सूचक जो स्टोरेज स्थान को संदर्भित करता है जहां ऑब्जेक्ट होगा या स्थित था, लेकिन सीमित तरीके से केवल उपयोग किया जा सकता है।

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