2010-08-17 13 views

उत्तर

14

अगर आप void func(int a = 0, int b); था, तुम कैसे इस कार्यप्रणाली को कॉल में डिफ़ॉल्ट पैरामीटर का उपयोग करने के लिए निर्दिष्ट हैं?

+6

मुझे पता है कि आप सी ++ में नहीं हो सकते हैं, लेकिन अन्य भाषाएं इसे 'func (, some_val_for_b)' या नाम पैरामीटर के साथ संभालती हैं। –

+1

@ डोमिनिक रॉजर: मेरे लिए जो वास्तव में बदसूरत दिखता है। – dierre

+2

@ डोमिनिक रॉजर, ठीक है, सी ++ नहीं है। यदि आप चाहते हैं कि आप Stroupstroup पर मुकदमा कर सकते हैं: पी –

-1

क्योंकि एक समारोह कॉल में आप किसी भी मामले में गैर-डिफ़ॉल्ट तर्क कॉल करनी होगी। यदि आप तर्क सूची की शुरुआत में अपना डिफ़ॉल्ट तर्क डालते हैं, तो आप कैसे कहें कि आप डिफ़ॉल्ट तर्क या अन्य को सेट कर रहे हैं?

+1

यह क्या है जो सूची की शुरुआत से मूल रूप से अलग सूची की शुरुआत करता है? सूचियां सममित हैं! –

+2

हां, लेकिन इसकी कल्पना करें: शून्य func (int a, int b = 0, int c, int d = 0); जब आप func (1, 2, 3) कहते हैं तो आप क्या कर रहे हैं; –

+0

और सूची का कौन सा अंत, बिल्कुल 'बी' है? –

1

बस @ tenfour के उत्तर को पूरक करने के लिए। सी ++ एफएक्यू लाइट के पास named parameters का वर्णन करने वाला विषय है और मुझे लगता है कि विषय आपकी समस्या को कुछ हद तक संबोधित करता है।

5

क्योंकि इस तरह भाषा को डिजाइन किया गया है।

एक और अधिक दिलचस्प सवाल होगा: विकल्प क्या हैं?

मान लीजिए आप void f(A a = MyA, B b);

  • प्लेसहोल्डर/खाली तर्क है: f(_, abee) या f(, abee)
  • नाम तर्कों (अजगर की तरह): f(b = abee)

लेकिन उन ब्योरा और निश्चित रूप से आवश्यक नहीं हैं, क्योंकि पायथन सी ++ के विपरीत फ़ंक्शन ओवरलोडिंग का समर्थन करता है:

  • void f(A a, B b);
  • void f(B b) { f(MyA, b); }

और इस तरह डिफ़ॉल्ट तर्क अनावश्यक हैं ... विशेष रूप से विचार कर वहाँ मुद्दों जब OO-कोड के साथ प्रयोग किया क्योंकि डिफ़ॉल्ट तर्क स्थिर हल कर रहे हैं हैं कि (संकलन समय)

struct Base 
{ 
    virtual void func(int g = 3); 
}; 

struct Derived 
{ 
    virtual void func(int g = 4); 
}; 

int main(int argc, char* argv[]) 
{ 
    Derived d; 
    d.func(); // Derived::func invoked with g == 4 

    Base& b = d; 
    b.func(); // Derived::func invoked with g == 3 (AH !!) 
} 

संपादित करें: नामित मानकों पर ->

सुविधा कार्य वस्तुओं का उपयोग कर नकल किया जा सकता है।

class Func 
{ 
public: 
    Func(B b): mA(MyA), mB(b) {} 

    A& a(A a) { mA = a; } 
    B& b(B b) { mB = b; } 

    void operator()() { func(mA, mB); } 
private: 
    A mA; 
    B mB; 
}; 

int main(int argc, char* argv[]) 
{ 
    A a; B b; 
    Func(b)(); 
    Func(b).a(a)(); 
} 

मामले में आप तर्क कॉपी नहीं करना चाहते, तो आप संभावना संदर्भ/संकेत का उपयोग करने, हालांकि यह जटिल हो सकता है।

यह एक आसान मुहावरा है जब आप प्राथमिकता का कोई वास्तविक आदेश के साथ चूक की एक पूरी बहुत कुछ है।

+0

फ़ंक्शन ओवरलोडिंग मदद नहीं करता है यदि 'ए' और' बी' दोनों एक ही प्रकार हैं ... –

+0

@ ओली: क्यों? पहला 'func' प्रोटोटाइप दिया गया है यह स्पष्ट है कि यदि केवल एक पैरामीटर है तो डिफ़ॉल्ट मान का उपयोग पहले पैरामीटर के लिए किया जाना चाहिए, जो भी उनके प्रकार का हो। जब आपके पास दो डिफ़ॉल्ट होते हैं तो चीजें बालों वाली होती हैं;) सामान्यतः, नामित पैरामीटर एकमात्र चीज हैं जो इस मुद्दे को हल कर सकती हैं, और यह बढ़िया बात यह है कि वे एक संकलन-समय समाधान हैं। –

+0

हां, आप सही हैं। मैंने सोचा था कि आप 'func (ए ए, बी बी) ',' func (बी बी)' * और * 'func (ए ए) 'को असंबद्ध करने के लिए ओवरलोडिंग का उपयोग कर रहे थे। –

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