আমি কেন এটি করতে পারি না?
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
আরম্ভ করা হচ্ছে being 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;
}
আপনি ডেরিভড ক্লাস অবজেক্টে উপস্থিত বেস ক্লাসের ডেটা সদস্যদের সূচনা করতে চান সে ক্ষেত্রে এটি একটি কার্যকরী উদাহরণ, যেখানে আপনি এই মানগুলি ডেরিভড ক্লাস কনস্ট্রাক্টর কলের মাধ্যমে ইন্টারফেসিংয়ে চাপতে চান।
যদিও এটি বিরল ক্ষেত্রে (যদি এটি না হয় তবে ভাষাটি সরাসরি এটির অনুমতি দিত । এটি কোনও কোড মুক্ত সমাধান নয়, আপনাকে উত্তরাধিকারের অতিরিক্ত স্তর যুক্ত করতে হবে তবে এটি কাজটি সম্পন্ন করে। বয়লারপ্লেট কোড এড়াতে আপনি বুস্টের বাস্তবায়নটি ব্যবহার করতে পারেন
আপনি এটা করতে পারবেন না কেন? কারণ ভাষা আপনাকে প্রাথমিক স্তরের 'ডারভেড ক্লাসের সদস্যদের' ইনিশিয়ালাইজার তালিকার প্রাথমিক অনুমতি দিতে দেয় না।
আপনি এটি কিভাবে করতে পারেন? এটার মত:
class A
{
public:
A(int a, int b) : a_(a), b_(b) {};
int a_, b_;
};
class B : public A
{
public:
B() : A(0,0)
{
}
};
আপনি যদি কোনও শ্রেণীর সদস্যের জন্য দৃশ্যমানতা নির্দিষ্ট না করেন তবে এটি "ব্যক্তিগত" -এ ডিফল্ট হয়। আপনি যদি নিজের সদস্যদের সাবক্লাসে অ্যাক্সেস করতে চান তবে আপনার ব্যক্তিগত বা ব্যক্তিগত সুরক্ষিত করা উচিত।
আপনার উদাহরণে (*) এ-এর মতো সমষ্টিগত ক্লাস অবশ্যই তাদের সদস্য পাবলিক থাকতে হবে এবং কোনও ব্যবহারকারী-সংজ্ঞায়িত কনস্ট্রাক্টর নেই have এগুলিকে প্রাথমিককরণ তালিকার সাথে নিবিষ্ট করা হয়েছে, যেমন A a {0,0};
বা আপনার ক্ষেত্রে B() : A({0,0}){}
। বেস সমষ্টিগত শ্রেণীর সদস্যগণ পৃথক পৃথকভাবে উত্পন্ন শ্রেণীর নির্মাতায় আরম্ভ করা যাবে না।
(*) যথাযথভাবে উল্লেখ করার মতো, যেমনটি সঠিকভাবে উল্লেখ করা হয়েছিল, class A
বেসরকারী অ স্থির সদস্যের কারণে আসলটি সমষ্টিগত নয়