2015-04-28 7 views
6

में डिफॉल्ट-निर्मित ऑब्जेक्ट में चर घोषित नहीं किया गया है उपर्युक्त कोड काम नहीं करता है। वास्तव में Foo के निर्माता में डिफ़ॉल्ट निर्मित ऑब्जेक्ट f शिकायत करता है कि मान val दायरे में घोषित नहीं किया गया है। मुझे समझ में नहीं आता कि यह क्यों घोषित नहीं किया गया है।कन्स्ट्रक्टर

struct Foo2 
{ 
    Foo2(int val) 
    {} 
}; 

struct Foo 
{ 
    Foo(int val, Foo2 f = Foo2(val)) 
    {} 
}; 

int main() 
{ 
    Foo f(1); 
    return 0; 
} 
+1

आप डिफ़ॉल्ट मापदंडों में पैरामीटर का उपयोग नहीं कर सकते। – chris

+2

इस प्रश्न में कोई डिफ़ॉल्ट निर्माता नहीं है। –

उत्तर

5

सी के अनुसार ++ मानक (8.3.6 डिफ़ॉल्ट तर्क):

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

किसी भी सी ++ (न केवल सी ++ 2014) में आप कन्स्ट्रक्टर को अधिभारित कर सकते हैं। उदाहरण के लिए

struct Foo 
{ 
    Foo(int val) 
    { Foo2 f(val); /*...*/ } 
    Foo(int val, Foo2 f) 
    {} 
}; 

या आप एक सौंपने के निर्माता (अपने संकलक नए मानक समर्थन करता है) का उपयोग कर सकते

struct Foo 
{ 
    Foo(int val) : Foo(val, Foo2(val)) 
    {} 
    Foo(int val, Foo2 f) 
    {} 
}; 
2

यह भाषा कैसे काम करती है; डिफ़ॉल्ट तर्क अन्य पैरामीटर पर निर्भर नहीं हो सकते हैं, क्योंकि उनके प्रारंभिकरण के क्रम को अनिर्दिष्ट छोड़ दिया गया है।

सी ++ 11 या बाद में, आप एक अधिभार के साथ इस पर काम कर सकते हैं:

Foo(int val) : Foo(val, Foo2(val)) {} 
+0

या आप ओवरलोडिंग का उपयोग कर सकते हैं। – refi64

+1

@ kirbyfan64sos यह क्या है? – LogicStuff

+2

@ kirbyfan64sos: मैं ओवरलोडिंग का उपयोग कर रहा हूं। –

0
struct Foo2 
{ 
    int x; 
    Foo2(int val): x(val) {} 
}; 

struct Foo 
{ 
    int y; 
    Foo2 f2; 
    Foo(int val, Foo2 f): y(val), f2(f) {} 
    Foo(int val): y(val), f2(val) {} 
}; 

int main() 
{ 
    Foo f(1); 
} 
+1

यह मानता है कि 'f2'' Foo' का सदस्य चर है। – Beta

0

आप इस को हल करने के टेम्पलेट का उपयोग कर सकते हैं:

struct Foo2 
{ 
    Foo2(int val) 
    {} 
}; 

template <int val> 
struct Foo 
{ 
    Foo(Foo2 f = Foo2(val)) 
    {} 
}; 

int main() 
{ 
    Foo<1> f = Foo<1>(); 
    return 0; 
} 
+0

हां मुझे पता है, लेकिन मैं चाहता हूं कि 'वैल' रनटाइम वैरिएबल –

+1

आह हो, आपको पहले स्थान पर कहा जाना चाहिए था। –

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