5

निम्नलिखित अच्छी तरह परिभाषित है?कन्स्ट्रक्टर प्रारंभिक सूची में परिपत्र निर्भरता

class A; 
class B; 

// define A, which takes B& in constructor 
// define B, which takes A& in constructor 

class C 
{ 
    A a; 
    B b; 
public: 
    C() : a(b), b(a) { /* stuff with a and b */ } 
} 

ideone.com पर पूरा उदाहरण।

क्या यह सुरक्षित/अच्छी तरह परिभाषित है जब तक कि A और B के लिए कन्स्ट्रक्टर उन संदर्भों के साथ कुछ भी नहीं करते हैं?

+1

डाउनवोट क्यों? मुझे बताएं कि मैं सवाल कैसे सुधार सकता हूं। – Claudiu

+0

मुझे नहीं लगता कि कंपाइलर आपको 'ए (बी)' करने की अनुमति देता है क्योंकि जब 'ए' प्रारंभ किया जा रहा है,' बी' अभी तक शुरू नहीं हुआ है। – user3528438

+0

@ user3528438: यह निश्चित रूप से करता है, आदर्श उदाहरण संकलित करता है और चलता है। लेकिन ऐसा इसलिए है क्योंकि मैं भाग्यशाली हूं या क्योंकि यह मानक में अच्छी तरह से परिभाषित है? – Claudiu

उत्तर

2

N4140 [class.cdtor]/1 में लिखा है:

एक गैर तुच्छ निर्माता के साथ एक वस्तु के लिए, निर्माता से पहले वस्तु के किसी भी गैर स्थिर सदस्य या आधार वर्ग की चर्चा करते हुए निष्पादन के परिणामों शुरू होता है अपरिभाषित व्यवहार में। एक गैर-तुच्छ विनाशक के साथ किसी ऑब्जेक्ट के लिए, विनाशक निष्पादन परिणामों को अपरिभाषित व्यवहार में समाप्त करने के बाद ऑब्जेक्ट के किसी भी गैर स्थैतिक सदस्य या बेस क्लास का जिक्र करता है।

हालांकि यह मार्ग स्वयं यह नहीं दर्शाता है कि व्यवहार अन्यथा अच्छी तरह परिभाषित है, निम्नलिखित उदाहरण से पता चलता है कि यह है। यहाँ एक अंश है:

struct B : public A { int j; Y y; }; // non-trivial 
extern B bobj; 
B* pb = &bobj; // OK 

तो जवाब है: हां, आपके मामले में व्यवहार में अच्छी तरह से अगर आप A के निर्माता में सदस्यों या b के आधार वर्ग की बात नहीं कर रहे हैं परिभाषित किया गया है।

+0

यह सहज ज्ञान युक्त है। तो फिर [user3528438 का उदाहरण] (https://ideone.com/V5uPyr) अपरिभाषित व्यवहार है क्योंकि 'm_a.m_value' को 'm_a' के कन्स्ट्रक्टर रन से पहले एक्सेस किया जाता है। संदर्भ खोदने के लिए धन्यवाद! – Claudiu

+0

@ क्लाउडिया सही, यह निश्चित रूप से यूबी है। –

+0

क्या आप किसी ऑब्जेक्ट को * संदर्भ * बांध सकते हैं जिसका अभी तक निर्माण नहीं हुआ है? पॉइंटर्स और संदर्भों के अर्थशास्त्र के बीच मतभेद हैं। उदाहरण के लिए, 'int * p = nullptr; int & r = * p; 'को यूबी माना जाता है, लेकिन' int * r = &*p; 'तर्कसंगत रूप से यूबी नहीं है (सी स्पष्ट रूप से इसे अनुमति देता है, उदाहरण के लिए)। – dyp

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