2009-03-13 18 views
8

आप मुझे बता सकते क्यों निम्नलिखित कोड मुझे निम्न त्रुटि दे रहा है - अतिभारित की कॉल 'सी (int) "अस्पष्टसी ++ - निर्माता से अधिक भार - निजी और सार्वजनिक

मुझे लगता है कि जब से सी (लगता होगा है चार एक्स) निजी है, केवल सी (फ्लोट) सीटीआर बाहर से दिखाई देता है और इसे int को फ्लोट में परिवर्तित करके बुलाया जाना चाहिए।

लेकिन ऐसा नहीं है।

class C 
{ 
    C(char x) 
    { 
    } 
public: 
    C(float t) 
    { 
    } 
}; 

int main() 
{ 
    C p(0); 
} 

उत्तर

18

इस पर स्कॉट मेयर द्वारा "प्रभावी सी ++" में चर्चा की गई है। कारण यह संदिग्ध है कि वे यह सुनिश्चित करना चाहते थे कि केवल सदस्य की दृश्यता को बदलना पहले से मौजूद कोड के अर्थ को कहीं और नहीं बदलेगा।

अन्यथा, मान लीजिए कि आपकी सी कक्षा कहीं शीर्षलेख में थी। यदि आपके पास एक निजी सी (int) सदस्य था, तो आपके द्वारा मौजूद कोड सी (फ्लोट) को कॉल करेगा। अगर, किसी कारण से, सी (int) सदस्य सार्वजनिक किया गया था, तो पुराना कोड अचानक उस सदस्य को कॉल करेगा, भले ही पुराना कोड न हो, न ही जिस समारोह को इसे बुलाया गया था बदल गया था।

संपादित करें: अधिक कारण हैं:

भी बदतर, मान लीजिए आप निम्नलिखित 2 कार्यों के लिए किया था:

C A::foo() 
{ 
    return C(1.0); 
} 

C B::bar() 
{ 
    return C(1.0); 
} 

इन दोनों कार्यों विभिन्न कार्यों है कि क्या या तो foo या बार एक दोस्त के रूप में घोषित किया गया था पर निर्भर करता है कह सकते हैं सी, या क्या ए या बी से विरासत में है। समान कोड कॉल विभिन्न कार्यों को डरावना है।

(यह शायद नहीं के रूप में अच्छी तरह से स्कॉट मेयर की चर्चा के रूप में डाल दिया है, लेकिन वह विचार है।)

+1

हम्म, यह एक महान स्पष्टीकरण तरह लग रहा था सर्वप्रथम। लेकिन ... कक्षा _without_ को int-ctor बनाने के लिए अभी भी संभव है, फिर बाद में _add_ कि ctor इतना पुराना कोड अचानक नए सदस्य को कॉल करना शुरू कर देता है ... इसलिए यह सुरक्षा केवल सुरक्षा की झूठी भावना पैदा करती है। –

+0

अच्छा बिंदु। मैं और जोड़ दूंगा। –

7

0 एक int प्रकार है। क्योंकि इसे स्पष्ट रूप से या तो एक फ्लोट या चार को समान रूप से डाला जा सकता है, कॉल संदिग्ध है। इन उद्देश्यों के लिए दृश्यता अप्रासंगिक है।

या तो 0.0, 0., या 0.0f शब्दों में कहें, या पूरी तरह से C(char) निर्माता से छुटकारा पाने के।

संपादित करें: मानक के संबंधित भाग, अनुभाग 13.3:

3) [...] लेकिन, एक बार उम्मीदवार कार्य करता है और तर्क सूचियों पहचान की गई है, सबसे अच्छा समारोह के चयन में एक ही है सभी मामलों में:

  • पहले, उम्मीदवार कार्यों-उन तर्कों की उचित संख्या है और कुछ अन्य को पूरा है कि के एक सबसेट की स्थिति-है व्यवहार्य कार्य (13.3.2) का एक सेट बनाने के लिए नहीं चुना गया।
  • फिर सर्वोत्तम व्यवहार्य फ़ंक्शन को प्रत्येक व्यवहार्य फ़ंक्शन के संबंधित पैरामीटर में प्रत्येक तर्क से मेल खाने के लिए आवश्यक रूपांतरण अनुक्रम (13.3.3.1) के आधार पर चुना जाता है।

4) यदि कोई सर्वोत्तम व्यवहार्य कार्य मौजूद है और अद्वितीय है, तो ओवरलोड रिज़ॉल्यूशन सफल होता है और परिणामस्वरूप इसे उत्पन्न करता है। अन्यथा ओवरलोड रिज़ॉल्यूशन विफल रहता है और आमंत्रण खराब बना हुआ है। जब ओवरलोड रिज़ॉल्यूशन सफल होता है, और जिस संदर्भ में इसका उपयोग किया जाता है, उसमें सबसे अच्छा व्यवहार्य कार्य सुलभ नहीं है (खंड 11), प्रोग्राम खराब है।

ध्यान दें कि दृश्यता चयन प्रक्रिया का हिस्सा नहीं है।

+0

आपने यह नहीं पता था कि क्यों निजीता अधिभार संकल्प को झुका नहीं देती है। –

+0

+1 यह आधा कहानी है, लेकिन दृश्यता को संबोधित नहीं करता –

+0

मानक उद्धरण के लिए अपवोट में बदल रहा है। –

-1

मुझे नहीं लगता कि कि:

C(float t) 

आप शायद करने की जरूरत है:

C p(0); 

करने के लिए परिवर्तित किया जा रहा है

C p(0.0f); 
+0

मामले में, यह समस्या नहीं है। '0' से फ्लोट * तक एक अंतर्निहित रूपांतरण मौजूद है। –

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