/ / C ++: स्पष्ट कंस्ट्रक्टर को निहित वर्ग द्वारा कहा जाता है - c ++

सी ++: स्पष्ट कन्स्ट्रक्टर को व्युत्पन्न क्लास - सी ++ द्वारा स्पष्ट रूप से बुलाया जाता है

क्यों एक निर्माणकर्ता को स्पष्ट करने से यह व्युत्पन्न वर्ग द्वारा निहित होने से नहीं रोकता है?

class A{
public:
explicit A(){}
};

class B : public A{
public:
B(){ //Constructor A() is called implicitly

//...
}
}

मेरे कार्यक्रम में मेरी स्थिति तब थी जब मैं "घ" के बजायउस मामले में संकलक त्रुटि है, यह एक बग को खोजने के लिए मुझे बहुत समय बचाएगा। अभी के लिए मैंने ए हासिल करने के लिए एक डमी "इंट" तर्क को स्वीकार करने के लिए ए के डिफ़ॉल्ट निर्माणकर्ता को बदल दिया, लेकिन इसके लिए "स्पष्ट" कीवर्ड काम नहीं करना चाहिए?

g ++ - 4.8 ऊपर दिए गए कोड को बिना किसी त्रुटि या चेतावनी के संकलित करता है।

उत्तर:

जवाब के लिए 8 № 1

आपकी धारणा गलत है explicit कीवर्ड।

The explicit कीवर्ड "एक व्युत्पन्न वर्ग से बुलाया जा रहा से निर्माता को रोकने के लिए नहीं है बल्कि अंतर्निहित रूपांतरण को रोकने के लिए यहाँ नमूने में एक तरह: https://stackoverflow.com/a/121163/1938163

मैं यहाँ प्रासंगिक भागों संक्षेप कर रहा हूँ:

class Foo
{
public:
// single parameter constructor, can be used as an implicit conversion
Foo (int foo) : m_foo (foo)
{
}

int GetFoo () { return m_foo; }

private:
int m_foo;
};

के बाद से सबसे कम एक अंतर्निहित रूपांतरण अस्पष्टता को हल करने के लिए किया जा सकता है, यदि आप की तरह एक समारोह है

void DoBar (Foo foo)
{
int i = foo.GetFoo();
}

निम्नलिखित कानूनी है:

int main ()
{
DoBar (42); // Implicit conversion
}

और कहा कि वास्तव में जहां स्पष्ट खोजशब्द खेलने में आता है: ऊपर के मामले मना करता है.

अपनी समस्या को हल करने के लिए, आदेश में एक आधार वर्ग के रूप में इस्तेमाल किया जा रहा से अपने वर्ग को रोकने के लिए, बस के साथ निर्माता चिह्नित अंतिम यदि आप C 11 का उपयोग कर रहे हैं (http://en.wikipedia.org/wiki/C++11#Explicit_overrides_and_final)


उत्तर № 2 के लिए 1

मुखर कीवर्ड आमतौर पर एक पैरामीटर है कि निर्माताओं के साथ प्रयोग किया जाता है.यह वर्ग के प्रकार के लिए पैरामीटर के प्रकार से ऑब्जेक्ट का अंतर्निहित निर्माण रोकता है।

नीचे दिए गए उदाहरण संकलन होगा, और यह आमतौर पर आप क्या चाहते हैं नहीं है:

#include <iostream>
using namespace std;

struct Test
{
Test(int t) {}
};

void test_fun(Test t) {}

int main() {
test_fun(1); //implicit conversion
return 0;
}

साथ में मुखर कीवर्ड इस उदाहरण won"t संकलन:

#include <iostream>
using namespace std;

struct Test
{
explicit Test(int t) {}
};

void test_fun(Test t) {}

int main() {
test_fun(1); //no implicit conversion, compiler error
return 0;
}