উত্পন্ন শ্রেণি নির্মাতায় বেস ক্লাসের সদস্য ভেরিয়েবল কীভাবে শুরু করতে পারি?


123

আমি কেন এটি করতে পারি না?

class A
{
public:
    int a, b;
};

class B : public A
{
    B() : A(), a(0), b(0)
    {
    }

};

7
আপনি কি এমনটি জিজ্ঞাসা করছেন যে আপনি কেন এটি করতে পারবেন না, এটি একটি ভাষা-নকশা প্রশ্ন, বা আপনি কীভাবে ভাষা সীমাবদ্ধতার আশেপাশে কাজ করবেন তা জিজ্ঞাসা করছেন ?
রব কেনেডি

আমি ভেবেছিলাম যে এটি করার একটি বিশেষ উপায় ছিল যা আমি অবগত নই, বেস কনস্ট্রাক্টর ব্যবহার না করেই।
amrhassan

বেস ক্লাসের সদস্যরা ইতিমধ্যে আপনার উদ্ভূত-শ্রেণীর নির্মাতা চালিত হওয়ার সময়টির মাধ্যমে সূচনা করা হয়েছে। আপনি করতে পারেন ধার্য আপনি অ্যাক্সেস আছে যদি তাদের, অথবা তাদের জন্য setters কল, অথবা আপনি বেস বর্গ কন্সট্রাকটর তাদের মান সরবরাহ করতে পারে, যদি সেখানে এক উপযুক্ত। উদ্দিষ্ট শ্রেণিতে আপনি যে জিনিসটি করতে পারবেন না তা হ'ল সেগুলি শুরু করা।
মারকুইস

উত্তর:


143

আপনি আরম্ভ করতে পারবেন না aএবং bBকারণ তারা সদস্য নয় B। তারা এর সদস্য A, সুতরাং কেবল Aতাদের সূচনা করতে পারেন। আপনি এগুলি সর্বজনীন করতে পারেন, তারপরে অ্যাসাইনমেন্টটি করুন B, তবে এটি প্রস্তাবিত বিকল্প নয় কারণ এটি এনক্যাপসুলেশনকে ধ্বংস করে দেবে। পরিবর্তে, (বা কোনও সাবক্লাস ) তাদের আরম্ভ Aকরার অনুমতি দেওয়ার জন্য একটি কনস্ট্রাক্টর তৈরি করুন:BA

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.
    {
    } 
};

32
যখন আপনার উদাহরণটি সঠিক, আপনার ব্যাখ্যাটি বিভ্রান্তিকর। এটা যে, আপনি নিজে করতে পারেন আরম্ভ a এবং bমধ্যে B::B()কারণ তারা ব্যক্তিগত। আপনি তাদের আরম্ভ করতে পারবেন না কারণ তারা এর সদস্য নয় class B। আপনি যদি এগুলিকে সর্বজনীন বা সুরক্ষিত করেন তবে আপনি তাদেরকে দেহের প্রধান অংশে নির্ধারণ করতে পারেন B::B()
আর স্যামুয়েল ক্লাতচকো

2
অতিরিক্ত হিসাবে, আপনি সমাধান ক্লাস এ-অ-সমষ্টিগত করে তোলে যা গুরুত্বপূর্ণ হতে পারে, সুতরাং এটি অবশ্যই উল্লেখ করা উচিত।
জিন বুশুয়েভ

1
@ আর স্যামুয়েল ক্লাটচকো: ভাল কথা। আমি যখন উত্তরটি লিখছিলাম তখন প্রাথমিকভাবে "আপনি অ্যাক্সেস করতে পারবেন না aএবং b..." টাইপ করেছিলেন এবং বাক্য বাকী বাক্যটি বোধগম্য না করে তা নিশ্চিত না করে এটিকে "আপনি আরম্ভ করতে পারবেন না ..." তে পরিবর্তন করে দিয়েছেন। পোস্ট সম্পাদিত।
সিলিকো

1
@ জিন বুশুয়েভ: প্রশ্নের মূল কোডের শ্রেণিটি একটি সামগ্রিক নয় (সেখানে কোনও স্থিতিশীল বেসরকারী সদস্য নেই)
ডেভিড রদ্রিগেজ -

@ ডেভিড - সঠিক, যা ব্যবহারকারীর ত্রুটি, এবং আমি ব্যবহারকারীর উদ্দেশ্যগুলি পাওয়ার চেষ্টা করছি, অতিমাত্রায় এড়িয়ে চলে।
জিন বুশুয়েভ

26

তারা 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) {}
};

7

যাইহোক, সহজ উপায় কেউ তালিকাভুক্ত করেনি:

class A
{
public:
    int a, b;
};

class B : public A
{
    B()
    {
        a = 0;
        b = 0;
    }

};

আপনি প্রাথমিকের তালিকায় বেস সদস্যদের অ্যাক্সেস করতে পারবেন না, তবে নির্ধারক নিজেই, অন্য কোনও সদস্য পদ্ধতির মতো, বেস ক্লাসের সদস্যদের অ্যাক্সেস করতে পারেন publicএবং protectedসদস্যদেরও করতে পারেন ।


1
খুশী হলাম। এভাবে করার ক্ষেত্রে কোনও ত্রুটি আছে কি?
ওয়ান্ডার 3 ই

2
@ সাইলেশডি: আপনি যদি কোনও ব্যয়বহুল কনস্ট্রাক্টর দিয়ে কোনও জিনিস শুরু করে থাকেন তবে সেখানে থাকতে পারে। উদাহরণটি Bবরাদ্দ করা হলে এটি প্রথমে ডিফল্ট-আরম্ভ হবে, তারপরে এটি Bনির্মাণকারীর ভিতরে নির্ধারিত হবে । তবে আমি আরও মনে করি যে সংকলকটি এখনও এটি অপ্টিমাইজ করতে পারে।
ভায়োলেট জিরাফ

1
ভিতরে class Aআমরা নির্ভর করতে পারি না aএবং bআরম্ভ করা হচ্ছে being class C : public Aউদাহরণস্বরূপ, এর যে কোনও বাস্তবায়ন কল করতে a=0;এবং aঅবিচ্ছিন্নভাবে ছেড়ে যেতে ভুলে যেতে পারে ।
স্পার্কোফস্কা

@ স্পারকোফস্কা, খুব সত্য। ক্ষেত্রগুলিকে ( class A { int a = 0;};) ঘোষণা করার সময় স্থানটিতে স্থির-প্রাথমিককরণ করা ভাল , বা বেস বর্গের নির্মাতায়। সাবক্লাসগুলি প্রয়োজন অনুসারে তাদের নির্মাণকারীগুলিতে এগুলি পুনরায় আরম্ভ করতে পারে।
ভায়োলেট জিরাফ

1
@ ওয়ান্ডার 3 আর একটি অপূর্ণতা হ'ল সমস্ত শ্রেণীর অ্যাসাইনমেন্ট অপারেটর নেই। কিছু কেবল নির্মিত যেতে পারে তবে নির্ধারিত হয় না। তারপরে আপনি হয়ে
মার্টিন পেক্কা

2
# 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;
}

আপনি ডেরিভড ক্লাস অবজেক্টে উপস্থিত বেস ক্লাসের ডেটা সদস্যদের সূচনা করতে চান সে ক্ষেত্রে এটি একটি কার্যকরী উদাহরণ, যেখানে আপনি এই মানগুলি ডেরিভড ক্লাস কনস্ট্রাক্টর কলের মাধ্যমে ইন্টারফেসিংয়ে চাপতে চান।


1

যদিও এটি বিরল ক্ষেত্রে (যদি এটি না হয় তবে ভাষাটি সরাসরি এটির অনুমতি দিত । এটি কোনও কোড মুক্ত সমাধান নয়, আপনাকে উত্তরাধিকারের অতিরিক্ত স্তর যুক্ত করতে হবে তবে এটি কাজটি সম্পন্ন করে। বয়লারপ্লেট কোড এড়াতে আপনি বুস্টের বাস্তবায়নটি ব্যবহার করতে পারেন


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) 
    {
    }
};

-1

আপনি যদি কোনও শ্রেণীর সদস্যের জন্য দৃশ্যমানতা নির্দিষ্ট না করেন তবে এটি "ব্যক্তিগত" -এ ডিফল্ট হয়। আপনি যদি নিজের সদস্যদের সাবক্লাসে অ্যাক্সেস করতে চান তবে আপনার ব্যক্তিগত বা ব্যক্তিগত সুরক্ষিত করা উচিত।


-1

আপনার উদাহরণে (*) এ-এর মতো সমষ্টিগত ক্লাস অবশ্যই তাদের সদস্য পাবলিক থাকতে হবে এবং কোনও ব্যবহারকারী-সংজ্ঞায়িত কনস্ট্রাক্টর নেই have এগুলিকে প্রাথমিককরণ তালিকার সাথে নিবিষ্ট করা হয়েছে, যেমন A a {0,0};বা আপনার ক্ষেত্রে B() : A({0,0}){}। বেস সমষ্টিগত শ্রেণীর সদস্যগণ পৃথক পৃথকভাবে উত্পন্ন শ্রেণীর নির্মাতায় আরম্ভ করা যাবে না।

(*) যথাযথভাবে উল্লেখ করার মতো, যেমনটি সঠিকভাবে উল্লেখ করা হয়েছিল, class Aবেসরকারী অ স্থির সদস্যের কারণে আসলটি সমষ্টিগত নয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.