অভ্যন্তরীণ ক্লাসগুলি কি ব্যক্তিগত ভেরিয়েবল অ্যাক্সেস করতে পারে?


117
class Outer {

    class Inner {
    public:
        Inner() {}
        void func() ;
    };

private:
    static const char* const MYCONST;
    int var;
};

void Outer::Inner::func() {
    var = 1;
}

const char* const Outer::MYCONST = "myconst";

এই ত্রুটিগুলি আমি যখন ক্লাস আউটার :: ইনার'এর সাথে `var 'নামক কোনও সদস্য নেই

উত্তর:


120

একটি অভ্যন্তরীণ বর্গটি শ্রেণীর একটি বন্ধু যার মধ্যে এটি সংজ্ঞায়িত হয়।
তাই হ্যাঁ; প্রকারের একটি বস্তু Outer::Innerসদস্য পরিবর্তনশীল অ্যাক্সেস করতে পারেন varধরনের একটি বস্তুর Outer

জাভা যদিও এর বিপরীতে, কোনও ধরণের Outer::Innerঅবজেক্ট এবং অভিভাবক শ্রেণীর একটি সামগ্রীর মধ্যে কোনও সম্পর্ক নেই । পিতা-মাতার সন্তানের সম্পর্ক আপনাকে ম্যানুয়ালি করতে হবে।

#include <string>
#include <iostream>

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::string a = "myconst1";
                std::cout << parent.var << std::endl;

                if (a == MYCONST)
                {   std::cout << "string same" << std::endl;
                }
                else
                {   std::cout << "string not same" << std::endl;
                }
            }
        private:
            Outer&  parent;
    };

    public:
        Outer()
            :i(*this)
            ,var(4)
        {}
        Outer(Outer& other)
            :i(other)
            ,var(22)
        {}
        void func()
        {
            i.func();
        }
    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main()
{

    Outer           o1;
    Outer           o2(o1);
    o1.func();
    o2.func();
}

14
প্রযুক্তিগতভাবে বর্তমান সি ++ স্ট্যান্ডার্ডে, কোনও নেস্টেড বর্গের তার ঘের ক্লাসে বিশেষ অ্যাক্সেস নেই। স্ট্যান্ডার্ডের ১১.৮.১ সেকেন্ড দেখুন। তবে এই স্ট্যান্ডার্ড ত্রুটিটিও দেখুন: ওপেন- std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45
গ্রেগ রজার্স

1
এর মূল্য কী, জিসিসি সেখানে প্রদত্ত প্রস্তাবিত রেজোলিউশন অনুসরণ করে, অন্য সংকলকরা সম্ভবত এটিও করেন।
গ্রেগ রজার্স

24
সি + 11 স্ট্যান্ডার্ড এখন উপরের বর্ণনার সাথে সম্মতিযুক্ত।
মার্টিন ইয়র্ক

1
জাভাতে, অনাবলিক অভ্যন্তরীণ বর্গকে অভ্যন্তরীণ শ্রেণীর প্রথম অ্যাক্সেস করা হলে তার বাইরের শ্রেণীর উদাহরণকে স্পষ্টভাবে একটি রেফারেন্স (পয়েন্টার) দেওয়া হয়। এটি পুনর্বিবেচনার জন্য, জেভিএম স্পষ্টতই আপনার জন্য একটি কোড লিখছে যা @ লকিআস্টারি তার উত্তরে আমাদের দেখিয়েছে তার অনুরূপ। কার্যকর জাভা 2 য় এডের একটি অংশ এখানে দেওয়া হয়েছে "আইটেম 22: ননস্ট্যাটিকের তুলনায় স্থির সদস্যের ক্লাসগুলি পছন্দ করুন": "আপনি যদি এই সংশোধকটিকে বাদ দেন (অভ্যন্তরীণ শ্রেণির ঘোষণা করার সময় স্থিতিশীল কীওয়ার্ড), প্রতিটি উদাহরণের সাথে তার সংলগ্ন উদাহরণটির জন্য বহিরাগত উল্লেখ থাকবে"।
ডেভিড লি

3
@ লোকি আস্তারি: আমি সর্বশেষ বাক্যটি পড়েছিলাম "আপনাকে পিতামাতার সাথে সম্পর্কটিকে ম্যানুয়ালি করতে হবে" এবং সঠিকভাবে কীভাবে এটি করতে হয় তার উদাহরণ হিসাবে অনুসরণ করা কোড খণ্ডটির ব্যাখ্যা দিয়েছিলাম !
ব্রেন্ট ব্যাকালা

32

একটি অভ্যন্তরীণ শ্রেণীর বাইরের শ্রেণীর সমস্ত সদস্যের অ্যাক্সেস রয়েছে তবে এটি পিতামাতা শ্রেণীর উদাহরণের সাথে অন্তর্নিহিত উল্লেখ নেই (জাভা সহ কিছু অদ্ভুততার চেয়ে পৃথক)। সুতরাং আপনি যদি বাইরের শ্রেণীর কোনও রেফারেন্সটি অভ্যন্তরীণ শ্রেণিতে পাস করেন তবে এটি বহিরাগত শ্রেণীর উদাহরণে কোনও কিছু রেফারেন্স করতে পারে।


7
এটি সি ++ 11
থ্রেন্টি

6

আউটারের অংশের যে কোনও কিছুতেই প্রকাশ্য বা বেসরকারী সকলের আউটারের সদস্যের অ্যাক্সেস থাকা উচিত।

সম্পাদনা করুন: আপনার সংকলকটি সঠিক, ভের ইনার সদস্য নয়। তবে আপনার যদি আউটারের কোনও উদাহরণের জন্য কোনও রেফারেন্স বা পয়েন্টার থাকে তবে এটি এতে অ্যাক্সেস করতে পারে।


2

var কোনও অভ্যন্তরীণ শ্রেণির সদস্য নয়।

ভ্যার অ্যাক্সেস করতে, কোনও বহিরাগত শ্রেণীর উদাহরণের জন্য একটি পয়েন্টার বা রেফারেন্স ব্যবহার করা উচিত। উদাহরণস্বরূপ পিউটার-> ভের কাজ করবে যদি অভ্যন্তরীণ শ্রেণি বাইরের বন্ধু হয়, বা, জন সর্বজনীন হয়, যদি কেউ সি ++ স্ট্যান্ডার্ড কঠোরভাবে অনুসরণ করে।

কিছু সংকলক অভ্যন্তরীণ ক্লাসগুলি বাইরের বন্ধু হিসাবে বিবেচনা করে তবে কিছু নাও পারে। আইবিএম সংকলকের জন্য এই নথিটি দেখুন :

"একটি নেস্টেড বর্গটি অন্য শ্রেণীর ক্ষেত্রের মধ্যে ঘোষিত হয় a নেস্টেড বর্গের নামটি তার ঘেরযুক্ত শ্রেণীর কাছে স্থানীয়। এনক্লোজিং ক্লাস এবং গ্লোবাল ভেরিয়েবলের নাম, স্থির সদস্য এবং গণক লিখুন।

নেস্টেড ক্লাসের সদস্য ফাংশনগুলি নিয়মিত অ্যাক্সেসের নিয়ম অনুসরণ করে এবং তাদের ঘের ক্লাসের সদস্যদের জন্য বিশেষ অ্যাক্সেসের কোনও সুযোগ নেই। ঘেরযুক্ত শ্রেণীর সদস্য কার্যাদি কোনও নেস্টেড শ্রেণীর সদস্যদের বিশেষ অ্যাক্সেস পায় না। "


4
ভুল। অন্যান্য উত্তর দেখুন - 3 বছর আগে। "যদি কেউ সি ++ স্ট্যান্ডার্ডটিকে কঠোরভাবে অনুসরণ করে", তারা আপনার কাছ থেকে বিভিন্ন জবাব পৌঁছে দেয়। সি ++ 11 এর প্রথম দিকের খসড়া হিসাবে, নেস্টেড ক্লাসগুলি পিতামাতার সমস্ত সদস্যকে একটি রেফারেন্স / পয়েন্টারের মাধ্যমে অ্যাক্সেস করতে পারে । সুস্পষ্টভাবে ঘোষণা করার friendবা প্রয়োজন নেই public। অতীতে মৃত লিঙ্কে আইবিএম ভুল / পুরানো ছিল কিনা কে যত্নশীল? এই উত্তরটি পোস্ট হওয়ার আগে 3 বছর পূর্বে ইতিমধ্যে তার তারিখের বাইরে ছিল।
আন্ডারস্কোর_২

1

প্রথমত, আপনি varক্লাসের বাইরে অ স্থিতিশীল সদস্য অ্যাক্সেস করার চেষ্টা করছেন যা সি ++ এ অনুমোদিত নয়।

মার্ক এর উত্তর সঠিক।

আউটারের অংশের যে কোনও কিছুতেই প্রকাশ্য বা বেসরকারী সকলের আউটারের সদস্যের অ্যাক্সেস থাকা উচিত।

আপনাকে দুটি জিনিস, হয় ঘোষণা করতে পারি না তাই varযেমন staticবা অ্যাক্সেস 'Var' (কারণ একটি বাইরের ক্লাসের একটা নিদর্শন একটি রেফারেন্স ব্যবহার বন্ধু বর্গ বা ফাংশন এছাড়াও এক্সেস ব্যক্তিগত ডেটাতে রেফারেন্স প্রয়োজন)।

স্ট্যাটিক ভার

varআপনি staticযদি varশ্রেণীর উদাহরণগুলির সাথে যুক্ত হতে না চান তবে পরিবর্তন করুন ।

#include <iostream>

class Outer {

private:
    static const char* const MYCONST;
    static int var;

public:
   class Inner {
    public:
        Inner() {
          Outer::var = 1;
        }
        void func() ;
    };
};

int Outer::var = 0;

void Outer::Inner::func() {
    std::cout << "var: "<< Outer::var;
}

int main() {
  Outer outer;
  Outer::Inner inner;
  inner.func();

}

আউটপুট- var: 1

অ স্থির ভার

কোনও অবজেক্টের রেফারেন্সটি অবশ্যই কোনও স্থায়ী সদস্যের পরিবর্তনশীল অ্যাক্সেস করতে পারে।

#include <iostream>

class Outer {

private:
    static const char* const MYCONST;
    int var;

public:
   class Inner {
    public:
        Inner(Outer &outer) {
          outer.var = 1;
        }
        void func(const Outer &outer) ;
    };
};

void Outer::Inner::func(const Outer &outer) {
    std::cout << "var: "<< outer.var;
}

int main() {
  Outer outer;
  Outer::Inner inner(outer);
  inner.func(outer);

}

আউটপুট- var: 1

সম্পাদনা করুন - বাহ্যিক লিঙ্কগুলি আমার ব্লগের লিঙ্ক।

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