উত্তর:
একটি অভ্যন্তরীণ বর্গটি শ্রেণীর একটি বন্ধু যার মধ্যে এটি সংজ্ঞায়িত হয়।
তাই হ্যাঁ; প্রকারের একটি বস্তু 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();
}
একটি অভ্যন্তরীণ শ্রেণীর বাইরের শ্রেণীর সমস্ত সদস্যের অ্যাক্সেস রয়েছে তবে এটি পিতামাতা শ্রেণীর উদাহরণের সাথে অন্তর্নিহিত উল্লেখ নেই (জাভা সহ কিছু অদ্ভুততার চেয়ে পৃথক)। সুতরাং আপনি যদি বাইরের শ্রেণীর কোনও রেফারেন্সটি অভ্যন্তরীণ শ্রেণিতে পাস করেন তবে এটি বহিরাগত শ্রেণীর উদাহরণে কোনও কিছু রেফারেন্স করতে পারে।
আউটারের অংশের যে কোনও কিছুতেই প্রকাশ্য বা বেসরকারী সকলের আউটারের সদস্যের অ্যাক্সেস থাকা উচিত।
সম্পাদনা করুন: আপনার সংকলকটি সঠিক, ভের ইনার সদস্য নয়। তবে আপনার যদি আউটারের কোনও উদাহরণের জন্য কোনও রেফারেন্স বা পয়েন্টার থাকে তবে এটি এতে অ্যাক্সেস করতে পারে।
var কোনও অভ্যন্তরীণ শ্রেণির সদস্য নয়।
ভ্যার অ্যাক্সেস করতে, কোনও বহিরাগত শ্রেণীর উদাহরণের জন্য একটি পয়েন্টার বা রেফারেন্স ব্যবহার করা উচিত। উদাহরণস্বরূপ পিউটার-> ভের কাজ করবে যদি অভ্যন্তরীণ শ্রেণি বাইরের বন্ধু হয়, বা, জন সর্বজনীন হয়, যদি কেউ সি ++ স্ট্যান্ডার্ড কঠোরভাবে অনুসরণ করে।
কিছু সংকলক অভ্যন্তরীণ ক্লাসগুলি বাইরের বন্ধু হিসাবে বিবেচনা করে তবে কিছু নাও পারে। আইবিএম সংকলকের জন্য এই নথিটি দেখুন :
"একটি নেস্টেড বর্গটি অন্য শ্রেণীর ক্ষেত্রের মধ্যে ঘোষিত হয় a নেস্টেড বর্গের নামটি তার ঘেরযুক্ত শ্রেণীর কাছে স্থানীয়। এনক্লোজিং ক্লাস এবং গ্লোবাল ভেরিয়েবলের নাম, স্থির সদস্য এবং গণক লিখুন।
নেস্টেড ক্লাসের সদস্য ফাংশনগুলি নিয়মিত অ্যাক্সেসের নিয়ম অনুসরণ করে এবং তাদের ঘের ক্লাসের সদস্যদের জন্য বিশেষ অ্যাক্সেসের কোনও সুযোগ নেই। ঘেরযুক্ত শ্রেণীর সদস্য কার্যাদি কোনও নেস্টেড শ্রেণীর সদস্যদের বিশেষ অ্যাক্সেস পায় না। "
friend
বা প্রয়োজন নেই public
। অতীতে মৃত লিঙ্কে আইবিএম ভুল / পুরানো ছিল কিনা কে যত্নশীল? এই উত্তরটি পোস্ট হওয়ার আগে 3 বছর পূর্বে ইতিমধ্যে তার তারিখের বাইরে ছিল।
প্রথমত, আপনি 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
সম্পাদনা করুন - বাহ্যিক লিঙ্কগুলি আমার ব্লগের লিঙ্ক।