2012-01-01 16 views
7

मेरे पास कक्षा ए के सदस्य हैं जो मेरी कक्षा में हैं जो कन्स्ट्रक्टर कई पैरामीटर लेता है। मैं कक्षा ए के निर्माता को अपनी खुद की कक्षा के पैरामीटर को अग्रेषित करता हूं लेकिन यह महत्वपूर्ण है कि ये पैरामीटर सही हैं, इसलिए मुझे ए के सदस्य को बनाने से पहले उन्हें जांचना होगा और समस्या का पालन करना होगा: मैं सदस्य को छोड़ सकता हूं सदस्य इंटिलाइजेशन सूची, प्रभावी रूप से डिफ़ॉल्ट कन्स्ट्रक्टर को बुला रही है। कन्स्ट्रक्टर में चेक के बाद मैं ए के कन्स्ट्रक्टर को एक वर्कमेंट में कॉल कर सकता था। हालांकि, यह एक त्रुटि उत्पन्न करता है क्योंकि ए के विनाशक निजी है।प्रारंभिक सूची से पहले चेक निष्पादित करें

मैं इसे कैसे हल करूं?

MyClass::MyClass(int someParam) : otherMember(2){ 
//checks for someParam 
member = A(someParam); // <- produces error 
} 
+0

कक्षा 'ए' के ​​लेखक से बात करें और उसे 'ए' का स्वयं का कन्स्ट्रक्टर अवैध पैरामीटर मानों की स्थिति में समझदारी से व्यवहार करने के लिए मजबूर करता है। –

+0

क्या यह 'ए' बनाने के लिए स्वीकार्य होगा और फिर तथ्य के बाद जांच करेगा? – Cameron

+0

मैंने वास्तव में जावा में स्वीकार्य बनाने के लिए सूर्य को मनाने की कोशिश की, लेकिन उन्होंने इनकार कर दिया। जावा में धोखा देना थोड़ा आसान है क्योंकि आप एक कन्स्ट्रक्टर को दूसरे से कॉल कर सकते हैं। – Neil

उत्तर

9

आपको एक सुलभ विनाशक की आवश्यकता होगी, चाहे आप क्या करें। लेकिन आपके प्रश्नों के उत्तरों, एक ही विकल्प प्रारंभकर्ता भीतर से मानकों की जांच करने के लिए एक स्थिर समारोह कॉल करने के लिए होगा:

class MyClass { 
    private: 
    static void checkParam(int); 
// ... 
}; 

MyClass::MyClass(int someParam) : otherMember((checkParam(someParam), 2)) { 
    // ... 
} 

static void MyClass::checkParam(int someParam) { 
    if (...) throw someException(); 
} 

नोट , इस्तेमाल अल्पविराम ऑपरेटर, नहीं एक तर्क विभाजक है कि वहाँ - यह दोनों को छोड़ दिया मूल्यांकन करता है और सही अभिव्यक्तियां, और बाईं के परिणाम को फेंक देती हैं।

+0

चेकपैम() में फंसे अपवादों को अभी भी प्रोग्रामफ्लो में बाधा डालेंगी? अगर इस सवाल का जवाब हाँ है, तो यह वही है जो मुझे चाहिए। आप में से जो निजी विनाशक के बारे में सोच रहे हैं, उनके संदर्भ में गिना जाता है; मैं appropiate संदर्भ गिनती सूचक का उपयोग कर gueess बेहतर होगा। – Paranaix

+0

हां। चेकपारा का मूल्यांकन '2' से पहले किया जाएगा, इसलिए यदि यह फेंकता है, तो' 2' मूल्यांकन नहीं करेगा, और इस प्रकार 'अन्य सदस्य' के निर्माता को बुलाया नहीं जा सकता – bdonlan

0

मैं इस आ करने के दो तरीके देखें:

  1. यकीन है कि वर्ग A एक पैरामीटर कम निर्माता के साथ प्रयोग किया जा सकता है, और एक अलग विधि में someParam सेट करें: A.SetSomeParam(someParam)

  2. से विरासत नहीं A, बल्कि A टाइप करें, और फिर जब भी आप चाहें इसे बना सकते हैं।

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