PDA

View Full Version : کاربرد کلاس های تو در تو (Nested Class)



chikar
پنج شنبه 14 خرداد 1394, 12:06 عصر
گفتم سوال خوبی برای پرسش هست، دوستان بفرمایند، کاربرد و دلیل استفاده از کلاس تو در تو چیست؟
لطف کنید توضیح بدید، مثلا اینکه عنوان شده، کاربردش در مخفی سازی جزئیات اجراست، خب یعنی چی ؟


class A
{
public:
A(){cout << "A is run";}
class B
{
public:
B() {cout << "B is run";}
int B_x;
};
};

rahnema1
پنج شنبه 14 خرداد 1394, 18:03 عصر
سلام
کاری نیست که با کلاسهای معمولی یا روشهای نشه انجام داد که قابلیتش فقط در کلاس تو در تو موجود باشه
اما مزیتهایی هم برای اون نام برده میشه مثلا دو کلاس که خیلی مرتبط با هم هستند و کلاسی که قراره زیر مجموعه کلاس دیگه باشه تنها و تنها لازم باشه در اون کلاس استفاده بشه و جای دیگه کاربردی نداشته باشه
اما همین تو در تویی ممکنه یه کم خواندن و فهم کد را پیچیده تر هم بکنه یا شاید ساختار برنامه و فضای نام را تمیز تر جلوه بده
در مورد مخفی کردن هم باز فرقی با کلاسهای معمولی وجود نداره. همون طور که در کلاس تودرتو می شه مخفی سازی کرد در کلاسهای معمولی هم میشه و این ویژگی فقط منحصر به کلاس تو در تو نیست
ضمن اینکه ممکنه من یک مساله را بتونم از چندین روش مثلا کلاس تو در تو یا مثلا ارث بری یا typedef یا فرضا آرایه تو در تو حل کنم ممکنه یه روش برای من دلچسب تر باشه و بتونم با اون روش بهتر رو مساله متمرکز بشم و تفکر کنم
اما زمانی که بخواهم برنامه را منتشر کنم که دیگران هم ببینند و بتونند استفاده کنند بهتره روشی را انتخاب کنم که برای دیگران قابل استفاده تر و قابل فهم تر باشه

-Geek-
پنج شنبه 14 خرداد 1394, 18:17 عصر
شاید شروع کردن با این مثال راه بهتری باشه


// Program 1

#include<iostream>

using namespace std;

/* start of Enclosing class declaration */
class Enclosing {

int x;

/* start of Nested class declaration */
class Nested {
int y;
void NestedFun(Enclosing *e) {
cout<<e->x; // works fine: nested class can access
// private members of Enclosing class
}
}; // declaration Nested class ends here
}; // declaration Enclosing class ends here

int main()
{

}




AND


// Program 2

#include<iostream>
using namespace std;

/* start of Enclosing class declaration */
class Enclosing {

int x;

/* start of Nested class declaration */
class Nested {
int y;
}; // declaration Nested class ends here

void EnclosingFun(Nested *n) {
cout<<n->y; // Compiler Error: y is private in Nested
}
}; // declaration Enclosing class ends here

int main()
{

}




خیلی واضعه فکر نکنم نیاز به توضیح اضافی داشته باشه.
دلیل استفاده اش هم که این پست (مخصوصا سومین جواب) به خوبی توضیح داده (http://stackoverflow.com/questions/4571355/why-would-one-use-nested-classes-in-c)