স্থির ক্ষেত্রগুলি উত্তরাধিকার সূত্রে প্রাপ্ত?


102

স্থিতিশীল সদস্যরা উত্তরাধিকার সূত্রে প্রাপ্ত হলে, তারা কি পুরো শ্রেণিবিন্যাসের জন্য স্থির হয়, বা কেবলমাত্র সেই শ্রেণীর, যেমন:

class SomeClass
{
public:
    SomeClass(){total++;}
    static int total;
};

class SomeDerivedClass: public SomeClass
{
public:
    SomeDerivedClass(){total++;}
};

int main()
{
    SomeClass A;
    SomeClass B;
    SomeDerivedClass C;
    return 0;
}

তিনটি ক্ষেত্রে মোট 3 হবে, বা এটি 2 SomeClassএবং 1 এর জন্য হবে SomeDerivedClass?

উত্তর:


55

3 সব ক্ষেত্রেই যেহেতু static int totalউত্তরাধিকার সূত্রে প্রাপ্ত SomeDerivedClassহয় ঠিক SomeClassতেমন একটি, কোনও পৃথক পরিবর্তনশীল নয়।

সম্পাদনা: আসলে সমস্ত ক্ষেত্রে 4 , যেমন @ ইজমাস স্পট করে তার উত্তরটিতে উল্লেখ করেছেন, যা দেখুন।

সম্পাদনা করুন: দ্বিতীয় প্রশ্নের কোডটি intউভয় ক্ষেত্রেই অনুপস্থিত , তবে এটি যুক্ত করা এটি ঠিক আছে, অর্থাত:

class A
{
public:
    static int MaxHP;
};
int A::MaxHP = 23;

class Cat: A
{
public:
    static const int MaxHP = 100;
};

এ :: ম্যাক্সএইচপি এবং ক্যাট :: ম্যাক্সএইচপি - এর জন্য বিভিন্ন মানের সাথে সূক্ষ্মভাবে কাজ করে এবং এই ক্ষেত্রে সাবক্লাসটি বেস শ্রেণীর থেকে স্ট্যাটিকটিকে "উত্তরাধিকারসূত্রে নয়", যেহেতু কথা বলার জন্য, এটি এটি তার নিজস্ব বেনামের সাথে "গোপন" করছে এক.


12
গুড ব্যাখ্যা, কিন্তু সংখ্যাগত উত্তর আসলে 4 হয়, আমার উত্তর (না 3. দেখুন stackoverflow.com/questions/998247/... )
e.James

3
+1, দুর্দান্ত পয়েন্ট, আমি আপনার প্রতি নির্দেশ করার উত্তর সম্পাদনা করছি, ধন্যবাদ!
অ্যালেক্স মার্টেলি

1
+1, যদিও স্থির সদস্যকে আরম্ভ করা যাই হোক না কেন তার পক্ষে আরও সঠিকভাবে "+4" বলা উচিত। স্থিতিশীল সদস্য স্থানীয় স্কোপ বা নেমস্পেসের সুযোগ নয়, সুতরাং কোথাও একটি সংজ্ঞা থাকতে হবে যা একটি মান নির্ধারণ করে ( প্রয়োজনীয়ভাবে শূন্য নয়)। অন্যথায় কোডটি এক-সংজ্ঞা-বিধি পূরণ করে না এবং সংকলন করবে না।
দামন

কিন্তু যদি কেউ static int totalপ্রতিটি উত্পন্ন শ্রেণীর জন্য আলাদা হতে চায় তবে এটি প্রতিটি ক্লাসে যুক্ত হওয়ার একমাত্র উপায় static int total? অথবা কেবলমাত্র বেস ক্লাস সংজ্ঞা (?) ব্যবহার করা সম্ভব, কারণ ভেরিয়েবল totalথাকা প্রত্যেক শ্রেণীর সম্পত্তি হওয়া উচিত। অন্যদিকে এটি হওয়া উচিত static
এলআরডিপিআরডিএক্সএক্স

97

উত্তরটি সব ক্ষেত্রেই চারটি , যেহেতু এটি নির্মাণের SomeDerivedClassফলে মোট দুবার বাড়ানো হবে ।

এখানে একটি সম্পূর্ণ প্রোগ্রাম (যা আমি আমার উত্তর যাচাই করার জন্য ব্যবহার করতাম):

#include <iostream>
#include <string>

using namespace std;

class SomeClass
{
    public:
        SomeClass() {total++;}
        static int total;
        void Print(string n) { cout << n << ".total = " << total << endl; }
};

int SomeClass::total = 0;

class SomeDerivedClass: public SomeClass
{
    public:
        SomeDerivedClass() {total++;}
};

int main(int argc, char ** argv)
{
    SomeClass A;
    SomeClass B;
    SomeDerivedClass C;

    A.Print("A");
    B.Print("B");
    C.Print("C");

    return 0;
}

এবং ফলাফল:

A.total = 4
B.total = 4
C.total = 4

10

এটি 4 কারণ ডেরিভেট অবজেক্ট তৈরি হওয়ার সময় ডেরিভড ক্লাস কনস্ট্রাক্টর বেস ক্লাস কনস্ট্রাক্টরকে কল করে।
সুতরাং স্থিতিশীল ভেরিয়েবলের মান দুবার বাড়ানো হয়।


5
#include<iostream>
using namespace std;

class A
{
public:
    A(){total++; cout << "A() total = "<< total << endl;}
    static int total;
};

int A::total = 0;

class B: public A
{
public:
    B(){total++; cout << "B() total = " << total << endl;}
};

int main()
{
    A a1;
    A a2;
    B b1;

    return 0;
}

এটি হবে:

A() total = 1
A() total = 2
A() total = 3
B() total = 4

1

সোমারড্লাইভক্লাস () ডাকা হয়ে গেলে সোমারক্লাস () কনস্ট্রাক্টরকে স্বয়ংক্রিয়ভাবে ডাকা হবে, এটি একটি সি ++ নিয়ম। একারণে প্রতি সোমারক্লাস বস্তুতে মোট একবার বৃদ্ধি করা হয় এবং তারপরে সোমডেরাইভড ক্লাস অবজেক্টের জন্য দুবার। 2x1 +2 = 4


0

তিনটি উদাহরণে 3।

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

এই কোডটি সমালোচনামূলক পথে না ডাকা যেখানে কার্যকারিতা প্রয়োজনীয়, সর্বদা আরও স্বজ্ঞাত কোডের জন্য বেছে নিন।


0

হ্যাঁ, উত্পন্ন শ্রেণিতে একই স্ট্যাটিক ভেরিয়েবল থাকবে, অর্থাত্ - এগুলিতে মোটের জন্য 3 টি থাকবে (ধরে নেওয়া যায় যে মোটটি কোথাও 0 থেকে শুরু করা হয়েছিল)।

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