2012-03-21 17 views
5

में डिफ़ॉल्ट मान मुझे अपने सी ++ वर्ग के सदस्यों के लिए डिफ़ॉल्ट मान निर्दिष्ट करने में समस्या है। मेरे कोड है:सी ++: वर्ग सदस्य

Someclass.h से:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool); 
} 

... SomeClass.cpp से:

void SomeClass::printOut(bool foobar=true) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

... और अंत में, main.cpp से :

int main() 
{ 
    SomeClass s; 
    s.printOut(); 
    return 0; 
} 

हालांकि यह त्रुटि संदेश (जीसीसी) देता है:

../main.cpp: In function `int main()': 
../main.cpp:8: error: no matching function for call to `SomeClass::printOut()' 
../SomeClass.h:18: note: candidates are: void SomeClass::printOut(bool) 
subdir.mk:21: recipe for target `main.o' failed 
make: *** [main.o] Error 1 

मैं सीधे हेडर फाइल में कक्षा घोषणा में डिफ़ॉल्ट मान को निर्दिष्ट करने की कोशिश की है, आदि मैं भी सामान्य रूप में खोज कर दोनों स्टैक ओवरफ़्लो और गूगल कोशिश की, लेकिन नहीं कर सकते कहीं भी कोई समाधान ढूंढें। मैं क्या गलत कर रहा हूं?

उत्तर

6

आप इस तरह के रूप में शीर्षक में पैरामीटर के लिए डिफ़ॉल्ट मान निर्दिष्ट नहीं किया है, कंपाइलर आपके कथन s.printOut(); के लिए हस्ताक्षर void printOut(void) के फ़ंक्शन की तलाश में है लेकिन इसे सही तरीके से नहीं ढूंढ रहा है। क्या आप की जरूरत है:

void SomeClass::printOut(bool foobar /*=true*/) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

एक तरफ ध्यान दें, मन में भालू आप कार्यान्वयन में पैरामीटर के लिए बाहर टिप्पणी की डिफ़ॉल्ट मान डाल करने के लिए की जरूरत नहीं है के रूप में:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut(bool fValue = true); // Note change in param in definition 
} 

और अपने cpp में फ़ाइल लेकिन पठनीयता के लिए यह एक अच्छा विचार है।

+0

मैं शपथ ले सकता था कि मैंने कोशिश की। : -एस हालांकि - जैसा कि मैंने निश्चित रूप से नहीं किया - यह पूरी तरह से काम करता है और मैं आपकी मदद के लिए बहुत आभारी हूं - धन्यवाद! – gustafbstrom

+0

मेरी खुशी, खुशी है कि मैं मदद कर सकता हूं। – Konrad

1

कार्यान्वयन में नहीं, विधि की घोषणा में डिफ़ॉल्ट मान निर्दिष्ट किया जाना चाहिए।

+0

धन्यवाद। उसने चाल बनाई! – gustafbstrom

4

आपको कक्षा परिभाषा के अंदर डिफ़ॉल्ट मान घोषित करने की आवश्यकता है, कार्यान्वयन में नहीं।

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar = true); //move default here 
} 

void SomeClass::printOut(bool foobar)  //remove from here 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

इसके अलावा, ध्यान दें कि:

SomeClass s(); 

आप इसे क्या करने की आशा नहीं करता है। यह SomeClass प्रकार का ऑब्जेक्ट s नहीं बनाता है, लेकिन रिटर्न प्रकार SomeClass के साथ फ़ंक्शन s घोषित करता है। s.printOut(); संकलित नहीं करना चाहिए।

आप शायद चाहते हैं:

SomeClass s; 
+0

मैं शपथ ले सकता था कि मैंने कोशिश की। : -एस हालांकि - जैसा कि मैंने निश्चित रूप से नहीं किया - यह पूरी तरह से काम करता है और मैं आपकी मदद के लिए बहुत आभारी हूं - धन्यवाद! इसके अलावा, एस() मुद्दा को इंगित करने के लिए धन्यवाद, जो वास्तव में इस मामले में एक टाइपो था। सही कोड-पढ़ने कौशल दिखाता है! – gustafbstrom

1

डिफ़ॉल्ट पैरामीटर इस तरह हेडर में निर्धारित किया जाना चाहिए:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool value = true); 
} 
1

अनुवर्ती के रूप में पुनः लिखें ..टिप्पणी bool ख = false

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool b=false); 
} 
1

कोशिश हेडर फाइल में डिफ़ॉल्ट मान निर्दिष्ट करने के लिए:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar=true); 
} 
0

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

void SomeClass::printOut() //or you can use: void SomeClass::printOut(bool foobar=true) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

... और अंत में main.cpp से: मैं ई \ कोड को सही तो आप समझ सकते हैं दिखाएगा:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar = true); 
} 

... SomeClass.cpp से

int main() 
{ 
    SomeClass s(); 
    s.printOut(); 
    return 0; 
} 
+0

यह संकलित नहीं होगा, आपके कार्यान्वयन में हस्ताक्षर गलत है – Konrad

+0

आप किस कोड के बारे में बात कर रहे हैं? –

+0

धन्यवाद, इसने चाल बनाई है। 'SomeClass s();' पंक्ति वास्तव में एक टाइपो थी जो निश्चित रूप से 'SomeClass s;' होना चाहिए, हालांकि इंगित करने के लिए धन्यवाद। – gustafbstrom

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