2008-10-14 20 views
6

क्या सी/सी ++ फंक्शन हेडर लिखने के लिए एक अच्छा तरीका है जो डिफ़ॉल्ट पैरामीटर के साथ है जो फ़ंक्शन कॉल हैं?फ़ंक्शन कॉल का परिणाम डिफ़ॉल्ट पैरामीटर मान के रूप में उपयोग किया जा सकता है?

int foo(int x, int y = 0); 

मैं एक बड़ी कोड आधार जहां कई कार्यों इस फ़ंक्शन को कॉल करते हैं और इस डिफ़ॉल्ट मान पर निर्भर में काम कर रहा हूँ:

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

int foo(int x, int y = bar()); 

बार() जहां कुछ समारोह है कि कुछ सिस्टम मापदंडों के आधार पर डिफ़ॉल्ट मान उत्पन्न करता है।

int foo(int x, int y = baz.bar()); 

कहाँ baz एक समारोह एक उद्देश्य यह है कि शीर्ष लेख फ़ाइल के भीतर instantiated नहीं किया गया है से संबंधित है: वैकल्पिक रूप से इस समारोह प्रोटोटाइप कैसा दिखेगा।

+0

AFAIK यह C++ नहीं सी (सी डिफ़ॉल्ट मानों का समर्थन नहीं करता) के लिए प्रासंगिक है। – Motti

उत्तर

6

हां। आपने जो लिखा है वह काम करता है।

+0

वास्तव में? मैंने कभी सोचा नहीं होगा। – Dima

+0

लॉल। मैंने खुद को कोशिश करने से पहले इसे स्पष्ट रूप से गलत बताया। –

+0

प्रोग्रामिंग सी ++ 8 साल के लिए किया गया था और यह नहीं पता था! – Justsalt

1

यह एक वैश्विक कार्य को कॉल करने या इस संदर्भ में वैश्विक वस्तु को संदर्भित करने के लिए पूरी तरह से मान्य होना चाहिए, जब तक कि कार्य/वस्तु की घोषणा दायरे में न हो। यह सलाह दी जा सकती है या नहीं (अच्छी डिजाइन के मामले में), लेकिन यह काम करना चाहिए।

7

मैं दो अतिभारित कार्यों का प्रयोग करेंगे:

int foo(int x, int y);

int foo(int x){return foo(x,bar);}

यदि आप अग्रेषण समारोह inlined करने की अनुमति है, तो प्रदर्शन दंड छोटे करने के लिए शून्य की संभावना है। यदि आप इसे गैर-हेडर फ़ाइल में लाइन से बाहर रखते हैं तो प्रदर्शन लागत (छोटी होने की संभावना) हो सकती है, लेकिन कार्यान्वयन और कम युग्मन में अधिक लचीलापन हो सकता है।

+0

अधिभारित कार्यों का उपयोग करने पर सुझाव अच्छा है, लेकिन questoin में कोड जैसा काम करता है। – Charlie

6

पहली घोषणा में वैकल्पिक पैरामीटर को हटाने और एकल पैरामीटर अधिभार प्रदान करने में क्या गलत है?

int foo(int x) 
{ 
    Bar bar = //whatever initialization 
    return foo(x,bar.baz()); 
} 

int foo(int x,int y) 
{ 
    //whatever the implementation is right now 
} 

मुझे लगता है कि यह कुछ गतिशील डिफ़ॉल्ट मान का उपयोग करने की कोशिश करने से अधिक स्वच्छ और अधिक लचीला होता है।

0

बार() एक स्थिर सदस्य फ़ंक्शन बनाने का प्रयास करें। यह कार्यक्रम के किसी भी भाग की अनुमति देगा जिसमें इस तरह के एक स्थिर वर्ग को पहुंचने के दायरे में है। उदाहरण के लिए:

वर्ग फू { सार्वजनिक:

स्थिर पूर्णांक बार(); };

तो फिर तुम घोषणा करेंगे:

पूर्णांक foo (int x, int y = फू :: बार());

यदि आपको विभिन्न ऑब्जेक्ट्स की आवश्यकता है तो ऑब्जेक्ट के उदाहरण में पास करें।

2

टेंगेंशियल, लेकिन ऐसा लगता है कि यह सड़क के नीचे निर्भरता के मुद्दों को पेश करेगा। मैं stbuton.myopenid.com के दृष्टिकोण के साथ जाऊंगा।

4

मानक में, खंड 8.3.6 (डिफ़ॉल्ट तर्क), अनुच्छेद 5, वे केवल इस दृष्टिकोण का उपयोग करके एक उदाहरण देते हैं। विशेष रूप से, यह कॉल करता है कि डिफ़ॉल्ट तर्क अभिव्यक्ति हैं, इसलिए फ़ंक्शन कॉल लागू होता है, यद्यपि नाम लुकअप और टाइप संगतता जैसे प्रतिबंधों के बावजूद।

मेरी कार्यस्थल में, हम इस तरह से इस्तेमाल किया हस्ताक्षर कर दिया है:

void An_object::An_object(
    const Foo &a, 
    const Bar &b, 
    const Strategem &s = Default_strategem() 
); 

ग्राहकों एक वर्ग निर्माता में एक व्यवहार को ओवरराइड करने के लिए अनुमति देने के लिए। यह सशर्त व्यवहार के लिए आसान था जो एक अनुवादक के प्रदर्शन को प्रभावित करता था ...

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

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