मैं ऐसा क्यों नहीं कर सकता?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
मैं ऐसा क्यों नहीं कर सकता?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
जवाबों:
आप प्रारंभ नहीं कर सकते हैं a
और b
में B
है क्योंकि वे के सदस्य नहीं हैं B
। वे सदस्य हैं A
, इसलिए केवल A
उन्हें आरंभ कर सकते हैं। आप उन्हें सार्वजनिक कर सकते हैं, फिर असाइनमेंट कर सकते हैं B
, लेकिन यह अनुशंसित विकल्प नहीं है क्योंकि यह एनकैप्सुलेशन को नष्ट कर देगा। इसके बजाय, उन्हें आरंभ A
करने के लिए B
(या किसी भी उपवर्ग A
) की अनुमति देने के लिए एक निर्माता बनाएँ :
class A
{
protected:
A(int a, int b) : a(a), b(b) {} // Accessible to derived classes
// Change "protected" to "public" to allow others to instantiate A.
private:
int a, b; // Keep these variables private in A
};
class B : public A
{
public:
B() : A(0, 0) // Calls A's constructor, initializing a and b in A to 0.
{
}
};
a
और b
में B::B()
, क्योंकि वे निजी हैं। आप उन्हें प्रारंभ नहीं कर सकते क्योंकि वे सदस्य नहीं हैं class B
। यदि आपने उन्हें सार्वजनिक या संरक्षित किया है तो आप उन्हें निकाय में दे सकते हैंB::B()
।
a
और b
" और इसे "आप इनिशियलाइज़ नहीं कर सकते ..." को बदल दिया, यह सुनिश्चित किए बिना कि बाकी वाक्य समझ में आए। पोस्ट संपादित किया गया।
इस तथ्य को छोड़ते हुए कि वे हैं private
, चूंकि a
और के b
सदस्य हैं A
, उनका मतलब A
कुछ अन्य वर्ग के निर्माणकर्ताओं द्वारा व्युत्पन्न किया जाना है (व्युत्पन्न या नहीं)।
प्रयत्न:
class A
{
int a, b;
protected: // or public:
A(int a, int b): a(a), b(b) {}
};
class B : public A
{
B() : A(0, 0) {}
};
किसी तरह, किसी ने सबसे सरल तरीका सूचीबद्ध नहीं किया:
class A
{
public:
int a, b;
};
class B : public A
{
B()
{
a = 0;
b = 0;
}
};
आप प्रारंभकर्ता सूची में पहुँच आधार सदस्यों नहीं कर सकते हैं, लेकिन निर्माता ही है, किसी भी अन्य सदस्य पद्धति के रूप में, का उपयोग कर सकते public
हैं और protected
आधार वर्ग के सदस्य।
B
आवंटित किया जाता है, तो इसे B
कंस्ट्रक्टर के अंदर सौंपा जाएगा । लेकिन मुझे यह भी लगता है कि कंपाइलर अभी भी इसे ऑप्टिमाइज़ कर सकता है।
class A
हम पर भरोसा नहीं किया जा सकता है a
और b
प्रारंभिक किया जा रहा है। class C : public A
उदाहरण के लिए, किसी भी क्रियान्वयन को कॉल करना a=0;
और a
अनधिकृत रूप से छोड़ना भूल सकते हैं ।
class A { int a = 0;};
या) या बेस क्लास के कंस्ट्रक्टर में घोषित करते समय फ़ील्ड्स को डिफ़ॉल्ट रूप से या तो इन-प्लेस करना सबसे अच्छा है । उप-वर्ग अभी भी आवश्यकतानुसार उनके निर्माणकर्ता में फिर से शुरू कर सकते हैं।
# include<stdio.h>
# include<iostream>
# include<conio.h>
using namespace std;
class Base{
public:
Base(int i, float f, double d): i(i), f(f), d(d)
{
}
virtual void Show()=0;
protected:
int i;
float f;
double d;
};
class Derived: public Base{
public:
Derived(int i, float f, double d): Base( i, f, d)
{
}
void Show()
{
cout<< "int i = "<<i<<endl<<"float f = "<<f<<endl <<"double d = "<<d<<endl;
}
};
int main(){
Base * b = new Derived(10, 1.2, 3.89);
b->Show();
return 0;
}
यदि आप व्युत्पन्न वर्ग ऑब्जेक्ट में मौजूद बेस क्लास डेटा सदस्यों को इनिशियलाइज़ करना चाहते हैं, तो यह एक कार्यशील उदाहरण है, जबकि आप इन मानों को Derived क्लास कंस्ट्रक्टर कॉल के माध्यम से इंटरफेस करना चाहते हैं।
हालांकि यह दुर्लभ मामलों में उपयोगी है (यदि ऐसा नहीं था, तो भाषा ने इसे सीधे अनुमति दी होगी), सदस्य मुहावरे से आधार पर एक नज़र डालें । यह एक कोड मुक्त समाधान नहीं है, आपको विरासत की एक अतिरिक्त परत जोड़ना होगा, लेकिन यह काम पूरा कर लेता है। बॉयलरप्लेट कोड से बचने के लिए आप बूस्ट के कार्यान्वयन का उपयोग कर सकते हैं
आप ऐसा क्यों नहीं कर सकते? क्योंकि भाषा आपको शुरुआती वर्ग की प्रारंभिक सूची में आधार वर्ग के सदस्यों को इनिज़ा देने की अनुमति नहीं देती है।
आप यह कैसे कर सकते हैं? ऐशे ही:
class A
{
public:
A(int a, int b) : a_(a), b_(b) {};
int a_, b_;
};
class B : public A
{
public:
B() : A(0,0)
{
}
};
यदि आप एक वर्ग के सदस्य के लिए दृश्यता निर्दिष्ट नहीं करते हैं, तो यह "निजी" के लिए चूक है। यदि आप उन्हें उपवर्ग में एक्सेस करना चाहते हैं तो आपको अपने सदस्यों को निजी या संरक्षित करना चाहिए।
अपने उदाहरण (*) में ए की तरह अलग कक्षाएं, उनके सदस्यों को सार्वजनिक होना चाहिए, और कोई उपयोगकर्ता-परिभाषित निर्माता नहीं होना चाहिए। उन्हें इनिशियल लिस्ट, उदाहरण के लिए A a {0,0};
या आपके मामले में सूचित किया जाता है B() : A({0,0}){}
। बेस एग्रीगेट वर्ग के सदस्यों को व्युत्पन्न वर्ग के निर्माता में व्यक्तिगत रूप से आरंभीकृत नहीं किया जा सकता है।
(*) सटीक होने के लिए, जैसा कि सही ढंग से उल्लेख किया गया था, class A
निजी गैर-स्थैतिक सदस्यों के कारण मूल एक समुच्चय नहीं है