2012-03-02 13 views
5

शायद यह बहुत आसान है, लेकिन क्या कोई मुझे बता सकता है कि मैं सुपरक्लास 'कन्स्ट्रक्टर में गणना किए गए तर्कों के साथ सुपरक्लास' कन्स्ट्रक्टर को कैसे कॉल कर सकता हूं? कुछ इस तरह:सी ++ कॉल किए गए तर्कों के साथ सुपरक्लास कन्स्ट्रक्टर को कॉल करें

class A{ 
    A(int i, int j); 
}; 

class B : A{ 
    B(int i); 
}; 

B::B(int i){ 
    int complex_calculation_a= i*5; 
    int complex_calculation_b= i+complex_calculation_a; 
    A(complex_calculation_a, complex_calculation_b); 
} 

// संपादित करें: मैं उदाहरण संपादित ताकि सुपर क्लास दो तर्क जो केवल इस तरह एक दूसरे को

उत्तर

4
आप एक एकल लाइन अभिव्यक्ति में अपने गणना व्यक्त नहीं कर सकते

हैं, एक स्थिर समारोह जोड़ें और रास्ते में इसे कहते आप सामान्य रूप से सुपर क्लास के निर्माता फोन:

class B : A{ 
public: 
    B(int i) : A(calc(i)) {}; 
private: 
    static int calc(int i) { 
     int res = 1; 
     while (i) { 
      res *= i--; 
     } 
     return res; 
    } 
}; 

संपादित एकाधिक-तर्क मामला:

class B : A{ 
public: 
    B(int i) : A(calc_a(i), calc_b(i)) {}; 
private: 
    static int calc_a(int i) { 
     int res = 1; 
     while (i) { 
      res *= i--; 
     } 
     return res; 
    } 
    static int calc_b(int i) { 
     int complex_a = calc_a(i); 
     return complex_a+10; 
    } 
}; 
+0

ठीक है - और यदि सुपरक्लास कन्स्ट्रक्टर कई तर्क लेता है? – Mat

+0

@Mat आपको प्रत्येक पैरामीटर के मान की गणना करने के लिए अलग-अलग फ़ंक्शन को परिभाषित करने की आवश्यकता होगी जिसे आप अभिव्यक्ति के रूप में "इनलाइन" नहीं करना चाहते हैं या नहीं करना चाहते हैं। – dasblinkenlight

+0

लेकिन गणना की गई तर्क एक दूसरे पर निर्भर हो सकती हैं - मैं इसे विभिन्न कार्यों के साथ कैसे हल कर सकता हूं? – Mat

1

करने के लिए एक रिश्ता नहीं है लेता है:

class A{ 
    A(int i); 
}; 

class B : A{ 
    B(int i); 
}; 

B::B(int i) : A(i*5) { 
} 

कॉल माता-पिता के निर्माता के लिए केवल प्रारंभिक सूची में ही आ सकता है। जिसका मतलब है कि जो कुछ भी आप की गणना कर रहे हैं से पहले बी पूरी तरह से निर्माण किया है पता होना चाहिए (यानी: यदि आप एक B सदस्य समारोह, कॉल नहीं कर सकते जब तक कि इसकी static, लेकिन केवल मापदंडों B के लिए पारित पर भरोसा करने की)

+0

ठीक करना चाहते हैं। मुझे तर्कों की गणना करने के लिए कई फ़ंक्शन कॉल, लूप, सशर्त शाखाकरण और इतने पर – Mat

+0

@Mat की गणना करने की आवश्यकता है - जैसा कि मैंने कहा - आप केवल बाहरी कार्य में ऐसा कर सकते हैं (या तो वैश्विक या स्थैतिक वर्ग सदस्य, या सदस्य का कार्य वस्तु 'बी' को पारित)। 'बी' मौजूद नहीं है जब 'ए' कहा जाता है। – littleadv

3
B::B(int i) 
    : A(i * 5) 
{} 

के साथ सी ++ 11, एक अधिक जटिल तरीके

B::B(int i) 
    : A(([](int x) { return 5 * x; })(i)) 
{} 

जटिल केस में, एक संरक्षित init समारोह अधिक पठनीय है।

1
struct A 
{ 
    A(int); 
}; 

struct B : public A 
{ 
    B() 
     : A(5) // "initialisation list" 
    {} 
}; 

आपको इसे सूची में करना है, लेकिन आप एक फ़ंक्शन का उपयोग कर सकते हैं। संपादित करें: - इस मामले में मेरी उदाहरण बुरा था आप एक समारोह का उपयोग करते हैं, तो आप शायद यह बी

के एक निजी स्थिर सदस्य
0
class A 
{ 
public: 
    A(int i){} 
}; 


class B : public A 
{ 
public: 
    B(int i):A(i*5){} 
}; 
संबंधित मुद्दे