2012-04-21 17 views
6

यह सरल उदाहरण आधार वर्ग कंस्ट्रक्टर्स फोन करने के लिए सी ++ वाक्य रचना को दर्शाता है के साथ एक आधार वर्ग निर्माता कॉलिंग - जहां तक ​​मैं एक सी के रूप में यह समझ में ++ में शिक्षार्थी:सी ++: एक गणना तर्क

class BaseClass { 
protected: 
    int i; 
public: 
    BaseClass(int x) { 
    i = x; 
    } 
}; 

class DerivedClass: public BaseClass { 
    int j; 
public: 
    DerivedClass(int x, int y): BaseClass(y) { 
    j = x; 
    } 

यहाँ, आधार वर्ग कन्स्ट्रक्टर व्युत्पन्न वर्ग कन्स्ट्रक्टर को इनपुट के रूप में नामों का नाम ले सकता है।

अब, अगर मैं BaseClass() कन्स्ट्रक्टर को इनपुट मान के साथ कॉल करना चाहता हूं जो DerivedClass() पर प्रत्यक्ष इनपुट नहीं है? असल में, मैं और y के साथ DerivedClass() के साथ कुछ मल्टीलाइन काम करना चाहता हूं, फिर गणना की गई मान BaseClass() पर पास करें। क्या यह रचनाकारों के साथ किया जा सकता है? क्या इसे किसी प्रकार की प्रारंभिक विधि के साथ किया जाना चाहिए?

उत्तर

11

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

class BaseClass 
{ 
    public: 
    BaseClass(int x) : i(x) {} 

    private: 
    int i; 
}; 

class DerivedClass: public BaseClass 
{ 
    public: 
    DerivedClass(int x, int y): 
     BaseClass(compute(x, y)), // Neither i or j are initialized here yet 
     j(x) 
     {} 

    private: 
    static int compute(int a, int b) { return a + b; } // Or whatever 
    int j; 
}; 

ध्यान दें कि आप भी compute() एक गैर स्थैतिक विधि बनाने लेकिन ध्यान रखें कि DerivedClass या BaseClass सदस्यों के समय में प्रारंभ नहीं जाएगा कर सकते हैं कहते हैं। तो आप उनके मूल्यों पर भरोसा नहीं कर पाएंगे।

+0

@Seth कार्नेगी ; 'ठीक है: डी अनुमान है कि मैं हाल ही में बहुत ज्यादा पायथन कर रहा हूं। – ereOn

2

तो फिर तुम यह कर सकते हैं:

DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) { 
    //j = x; //use member-initialization-list ---> ^^^^ 
    } 

int compute(int x, int y) 
{ 
    //your code 
} 
3

आप सी ++ 11 या नए प्रयोग कर रहे हैं आप भी लैम्ब्डा एक्सप्रेशन का उपयोग कर सकते हैं: लापता `के लिए धन्यवाद:

class BaseClass 
{ 
    public: 
    BaseClass(int x) : i(x) {} 

    private: 
    int i; 
}; 

class DerivedClass: public BaseClass 
{ 
    public: 
     DerivedClass(int x, int y): BaseClass(
      [=]()->int 
      { 
       int sum = 0; 
       for(int i = 0; i < x; ++i) 
       { 
        sum += y + i * x; 
       } 
       return sum; 
      }()), j(x) 
     {} 

    private: 
    int j; 
}; 
+1

+1 अनुस्मारक के लिए है कि लैम्ब्डा मौजूद है। लेकिन अगर गणना बहुत बड़ी है तो यह अच्छा नहीं होगा। यह कन्स्ट्रक्टर (आईएमएचओ) को पढ़ना मुश्किल बनाता है। – Nawaz

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