2015-09-04 20 views
6

मैं एक वर्ग बनाना चाहता हूं, जिसमें दो पूर्णांक सदस्य चर हैं, और एक फ़ंक्शन जिसमें दो वैकल्पिक तर्क हैं। यदि इन तर्कों की आपूर्ति की जाती है, तो फ़ंक्शन उनका योग देता है; यदि इन तर्कों की आपूर्ति नहीं की जाती है, तो फ़ंक्शन अपने दो सदस्य चर के योग को वापस कर देता है।गैर-स्थैतिक सदस्य चर के रूप में डिफ़ॉल्ट तर्क

यहाँ कोड है:

class Foo 
{ 
private: 
    int x_; 
    int y_; 
public: 
    Foo(int x, int y) : x_(x), y_(y){} 
    int Bar(int a = x_, int b = y_) 
    { 
     int z = a + b; 
     return z; 
    } 
}; 

हालांकि, मैं निम्नलिखित संकलन त्रुटि मिलती है:

invalid use of non-static data member 'Foo::x_' 
int x_; 
    ^
invalid use of non-static data member 'Foo::y_' 
int y_; 
    ^

यह पता चलता है कि सदस्य चर में डिफ़ॉल्ट तर्क के रूप में उन्हें में उपयोग करने के लिए स्थिर होना जरूरी एक समारोह। लेकिन मैं नहीं चाहता कि वे स्थिर हों ...

समाधान क्या है?

+1

हाँ, वे स्थिर होने के लिए, देखना है (http://stackoverflow.com/q/ 27018251/1708801) –

उत्तर

6

अधिभार Bar:

int Bar() 
{ 
    return x_ + y_; 
} 

int Bar(int x) 
{ 
    return x + y_; 
} 

int Bar(int x, int y) 
{ 
    return x + y; 
} 

इस सुधार के लिए @ Jarod42 के लिए धन्यवाद:

int Bar(int a, int b) 
{ 
    return a + b; 
} 

int Bar(int a) 
{ 
    return Bar(a, y_); 
} 

int Bar() 
{ 
    return Bar(x_, y_); 
} 

वास्तविक दुनिया समस्या को हल करने की कोशिश कर रहे एक से अधिक इस रिफैक्टरिंग से लाभ होने की संभावना है दो संख्याओं को इकट्ठा करने की मूल समस्या। यह व्यवहार अधिक स्पष्ट रूप से समान है कि आप डिफ़ॉल्ट तर्कों के माध्यम से प्राप्त करने की उम्मीद कर रहे थे।

+4

मैं कोड को कारक बनाने के लिए अन्य संस्करण में 'बार (int, int)' कहूंगा (मेरा मतलब है 'int बार() {वापसी बार (_x, _y);} ') – Jarod42

5

का संभावित हल अपने Bar समारोह ओवरलोड होगी: [? क्यों इन डिफ़ॉल्ट तर्क अनुमति दी जाती है]

int Bar() 
{ 
    return x_ + y_; 
} 
int Bar(int a) 
{ 
    return a + y_; 
} 
int Bar(int a, int b) 
{ 
    return a + b; 
} 
+4

मैं' बार (int, int) 'कोड को कारक बनाने के लिए अन्य संस्करण में (मेरा मतलब है' int बार() {वापसी बार (_x, _y);} ') – Jarod42

+0

@ जारोड 42 अच्छा बिंदु। मुझे लगता है कि इसे व्यक्त करने के लिए आपका एक और शानदार तरीका है। – Logicrat

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