2011-10-13 22 views
15

में कक्षा सदस्य के कॉलर कन्स्ट्रक्टर को कॉल करना क्या मैं अपने कक्षा के निर्माता में किसी सदस्य का निर्माता कह सकता हूं?कन्स्ट्रक्टर

मान लें कि मेरे पास 10 वर्ग foo कक्षा MClass में सदस्य है। क्या मैं एमसीएलएएस के कन्स्ट्रक्टर में बार के कन्स्ट्रक्टर को कॉल कर सकता हूं? यदि नहीं, तो मैं अपने सदस्य बार को कैसे प्रारंभ कर सकता हूं?

यह संरचना (एकत्रीकरण) में सदस्यों को आरंभ करने की एक समस्या है।

उत्तर

26

हाँ, निश्चित रूप से आप कर सकते हैं! कन्स्ट्रक्टर प्रारंभकर्ता सूची यही है। यह एक अनिवार्य विशेषता है कि आप सदस्यों डिफ़ॉल्ट कंस्ट्रक्टर्स की जरूरत नहीं है कि, साथ ही स्थिरांक और संदर्भ प्रारंभ करने की आवश्यकता होती है:

class Foo 
{ 
    Bar x;  // requires Bar::Bar(char) constructor 
    const int n; 
    double & q; 
public: 
    Foo(double & a, char b) : x(b), n(42), q(a) { } 
    //      ^^^^^^^^^^^^^^^^^^^ 
}; 

आप आगे में आधार वर्ग के लिए एक गैर-डिफ़ॉल्ट निर्माता निर्दिष्ट करने के लिए प्रारंभकर्ता सूची की ज़रूरत है व्युत्पन्न वर्ग रचनाकार।

3

इस तरह:

class C { 
    int m; 

public: 

    C(int i): 
    m(i + 1) {} 

}; 

अपने सदस्य निर्माता मापदंडों चाहता है, तो आप उन्हें पारित कर सकते हैं। वे कक्षा कन्स्ट्रक्टर पैरामीटर और पहले से प्रारंभिक प्रकार से किए गए भाव हो सकते हैं।

याद रखें: सदस्यों को कक्षा में घोषित क्रम में प्रारंभ किया जाता है, न कि वे प्रारंभिक सूची में दिखाई देने वाले क्रम में।

2

हाँ, आप कर सकते हैं। यह आपकी कक्षा की आरंभिक सूची में किया जाता है। । उदाहरण के लिए:

class MClass 
{ 

    foo bar; 

public: 

    MClass(): bar(bar_constructor_arguments) {}; 
} 

यह तर्क आम तौर पर में पारित साथ bar का निर्माण करेगी, तर्क अपनी कक्षा या तर्क है कि अपने निर्माता को पारित किए गए के अन्य सदस्य होंगे। यह वाक्यविन्यास उन किसी भी सदस्यों के लिए आवश्यक है जिनके पास कोई तर्क नहीं है।

3

आरंभकर्ता सूची के माध्यम से, यदि बेस क्लास में डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है।

struct foo{ 
    foo(int num) 
    {} 
}; 

struct bar : foo { 
    bar(int x) : foo(x) 
       // ^^^^^^ initializer list 
    {} 
}; 
6

हाँ, आप कर सकते हैं:

#include <iostream> 

using std::cout; 
using std::endl; 

class A{ 
public: 
    A(){ 
     cout << "parameterless" << endl; 
    } 

    A(const char *str){ 
     cout << "Parameter is " << str <<endl; 
    } 
}; 

class B{ 
    A _argless; 
    A _withArg; 

public: 
    // note that you need not call argument-less constructor explicitly. 
    B(): _withArg("42"){ 
    } 
}; 

int main(){ 
    B b; 

    return 0; 
} 

उत्पादन होता है:

parameterless 
Parameter is 42 

View this on ideone.com

+0

तर्क-कम सदस्य कंस्ट्रक्टर्स स्पष्ट रूप से कहा जा नहीं होने पर आपकी टिप्पणी मैं वास्तव में क्या किया गया है खोज रहे हैं धन्यवाद! – Jaime

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