2013-02-19 21 views
6

मैं वैश्विक चर को खत्म करने के लिए कुछ कोड लिख रहा हूं और कुछ तृतीय पक्ष लाइब्रेरी संसाधनों के क्लास कन्स्ट्रक्टर/विनाशक हैंडल क्लीनअप को बनाया है, लेकिन मुझे कुछ कोड के बारे में चिंतित है जो कक्षा प्रारंभकर्ता सूची में किसी अन्य सदस्य से एक सदस्य को प्रारंभ करता है।क्या मैं बाद में सूची में प्रारंभकर्ता सूची में शुरू किए गए सी ++ वर्ग के सदस्यों का उपयोग कर सकता हूं?

class MyPodofoDocument { 
public: 
    // generates pdf to stream 
    MyPodofoDocument(std::stringstream *pStringStream) 
     : device(pStringStream), document(&device) 
    { 
    } 
private: 
    PoDoFo::PdfOutputDevice device; 
    PoDoFo::PdfStreamedDocument document; 
    PoDoFo::PdfPainter painter; 
}; 

कोड है जो इस वर्ग का उपयोग करता है सभी विवरण लाइब्रेरी का उपयोग कर में जाने देखने की जरूरत नहीं है, लेकिन इससे पहले कि यह हिट तरह से मैं उन्हें छिपाने के लिए, यह अन्य सदस्यों प्रारंभ करने में सदस्यों के प्रयोग पर निर्भर करता है कन्स्ट्रक्टर का वास्तविक कोड ब्लॉक, जहां यह इस सूचक को मान्य करता है।

यह एक यूनिट टेस्ट कंकाल में काम करता है, इसलिए मेरा प्रश्न मूल रूप से है, "क्या यह ठीक है, पोर्टेबल और सुरक्षित है?"

उत्तर

8

सदस्यों, नीचे

PoDoFo::PdfOutputDevice device; 
PoDoFo::PdfStreamedDocument document; 
PoDoFo::PdfPainter painter; 

तो यह device उपयोग करने के लिए document प्रारंभ करने के लिए सुरक्षित है करने के लिए शीर्ष क्रम में प्रारंभ कर रहे हैं वे घोषित कर रहे हैं।

+0

इसके अलावा, यह पता लगाने के लिए कानूनी है कि अभी तक एक सदस्य बनने के लिए संदर्भ (यानी आप किसी सदस्य को संदर्भित कर सकते हैं यदि रिसीवर * ऑब्जेक्ट का उपयोग नहीं करता है, लेकिन केवल संदर्भ/सूचक)। –

+0

पास करना कानूनी है, लेकिन अर्थात् गलत है, क्योंकि आप किसी ऐसे सूचक को पास कर रहे हैं जो अभी तक नहीं बनाया गया है। –

+0

@AlexChamberlain: इसके साथ कुछ भी गलत नहीं है, लेकिन शायद एक डबल चेक की जरूरत है। – GManNickG

4

तरह। नियम यह है कि सदस्य चर को कक्षा घोषणा में घोषित क्रम में शुरू किया जाता है।

आपके मामले में, यह ठीक है devicedocument से पहले घोषित किया गया है।

हालांकि, प्रारंभिक सूची के क्रम के बावजूद, हमने निम्नलिखित मामले में व्यवहार को अपरिभाषित किया है।

class A { 
public: 
    A(int i) : b(i), a(b) { } 
private: 
    int a; 
    int b; 
} 
+1

भले ही यह सुरक्षित है * जब तक चर के बीच निर्भरता घोषणा आदेश * के समान होती है, IMHO यह बहुत अच्छा अभ्यास नहीं है। जब भी संभव हो तो इस तरह के कोड से बचा जाना चाहिए यदि केवल इसलिए कि आपकी कक्षा को पुन: सक्रिय करते समय घोषणा आदेश को गलती से संशोधित करना बहुत आसान है, इस प्रकार यूबी को एलेक्स के उदाहरण के रूप में ट्रिगर करना इसे दिखाता है। दूसरे शब्दों में, यह सही है लेकिन बहुत नाजुक है। – syam

+1

@syam: मुझे भी यकीन नहीं है ... मैं वही सोचता था, लेकिन संकलक आपको चेतावनी देने के लिए बहुत आसान है अगर प्रारंभकर्ता आदेश से बाहर हैं (संकलक संभावित यूबी पर आपका ध्यान बुलाएगा) और कुछ मामलों में यह एक ही प्रकार के एक अलग सदस्य को संदर्भित करने में मदद कर सकता है। –

+0

यह एक ही प्रकार के पाठ्यक्रम की चीजों के लिए उपयोगी नहीं है; कुछ भी जहां चर के बीच वास्तविक निर्भरता है, लेकिन जहां आपको चर को स्टोर करने की आवश्यकता है। –