2010-08-06 15 views
10

मैं इस तरह एक वर्ग है:मेरा ओवरलोडेड सी ++ कन्स्ट्रक्टर क्यों नहीं कहा जाता है?

class Test{ 
public: 
    Test(string value); 
    Test(bool value); 

}; 

अगर मैं इस तरह एक वस्तु बनाने के लिए:

Test test("Just a test..."); 

bool निर्माता कहा जाता है!

कोई भी जानता है क्यों?

धन्यवाद

+0

सी ++ तरीकों, btw, केवल सदस्य फ़ंक्शन नहीं है रूपांतरण ऑपरेटरों के लिए बढ़ा दिया गया है। इसके अलावा आप यहां रचनाकारों के बारे में बात कर रहे हैं। –

+0

वाह, मैं आज भी एक ही समस्या में भाग गया! – Milan

उत्तर

18

"Just a test..." के प्रकार const char * है, जो परोक्ष या तो bool या std::string में बदला जा सकता। क्योंकि std::string एक प्रकार का निर्मित नहीं है, const char * एस को bool में परिवर्तित किया गया है। आपको लगता है कि रोका जा सकता है स्पष्ट रूप से एक std::string करने के लिए const char * परिवर्तित करके:

Test test(std::string("Just a test...")); 
+2

फिक्स सही है, लेकिन स्पष्टीकरण पूरी तरह से सही नहीं है। आप * 'const char *' से 'std :: string' (' std :: string' के रचनाकारों में से एक के माध्यम से) से निहित रूप से परिवर्तित कर सकते हैं। यह सिर्फ इतना है कि बूल रूपांतरण को प्राथमिकता दी जाती है। –

+0

मैं वह परिवर्तन करूंगा - धन्यवाद! –

+1

"बस एक परीक्षण ..." char * नहीं है। सी ++ में यह चार const [] है। –

4

"Just a test..." के प्रकार const char* है। पॉइंटर्स से bool में एक अंतर्निहित रूपांतरण है जिसे const char* से std::string पर गैर-अंतर्निर्मित रूपांतरण पर प्राथमिकता दी जाती है।

कारण है कि बूल रूपांतरण को प्राथमिकता दी जाती है क्योंकि std::string, मानक लाइब्रेरी का हिस्सा, एक अंतर्निहित प्रकार जैसे पूर्णांक, पॉइंटर्स और बूलियन नहीं है। यह किसी अन्य वर्ग की तरह कार्य करता है, और इसलिए इसके रूपांतरण कन्स्ट्रक्टर केवल अंतर्निहित प्रकारों के रूपांतरण के बाद विचार किए जाते हैं।

8

यह एक अच्छी तरह से ज्ञात सी ++ झुंझलाहट है।

आपका स्ट्रिंग शाब्दिक [] चैट स्थिरांक के प्रकार है। आप दो कंस्ट्रक्टर्स, चार स्थिरांक से रूपांतरण दृश्यों [] का परीक्षण करने के लिए इस तरह दिखना मिल गया है:

1) चार स्थिरांक [] -> चार स्थिरांक * -> bool

2) चार स्थिरांक [] -> चार स्थिरांक * -> std :: स्ट्रिंग

1) है एक अंतर्निहित है जबकि 2 मानक रूपांतरण) उपयोगकर्ता-निर्धारित रूपांतरण है। बिल्ट-इन रूपांतरणों में उपयोगकर्ता परिभाषित रूपांतरणों की प्राथमिकता है, इस प्रकार आपकी स्ट्रिंग शाब्दिक std :: स्ट्रिंग की तुलना में बूल में अधिक आसानी से परिवर्तित हो जाती है। इस तरह के प्रकार स्पष्ट रूप से std::string रूप में परिभाषित है यह निर्माता कि bool स्वीकार करता है के लिए डिफ़ॉल्ट नहीं होंगे

std::string test = "TEST"; 
A a(test); 

:

0

एक ही रास्ता के प्रकार std :: स्ट्रिंग एक चर बना सकते हैं और में चर पारित करने के लिए है

3

एक तरह से इस समस्या को नाकाम करने के लिए, एक और निर्माता एक स्थिरांक चार * लेने और फिर एक std :: स्ट्रिंग के लिए स्पष्ट रूप से परिवर्तित प्रदान करना है।

1

आप एक निर्माता (विशेष रूप से कई निर्माताओं) है कि केवल एक ही तर्क ले उपलब्ध हो तो उसे उन्हें "स्पष्ट" घोषित करने के लिए आश्चर्य इस तरह से बचने के लिए उपयुक्त हो सकता है। यह वर्ग के उपयोगकर्ता को यह सुनिश्चित करने के लिए मजबूर करता है कि वह उस कन्स्ट्रक्टर को सही प्रकार देता है जिसे वह उपयोग करना चाहता है और इन अंतर्निहित प्रकार के रूपांतरणों को उपयोगकर्ताओं के पीछे किए जाने से रोकता है और बग खोजने के लिए कड़ी मेहनत करता है।

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15&rll=1

C++ 0x में, यह एक ही मुद्दे को रोकने के लिए

http://www2.research.att.com/~bs/C++0xFAQ.html#explicit-convertion

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