Delegating Constructors
قابلیت constructor delegation در سی++
قبلا وقتی داشتم یه کلاسی مینوشتم که چنتا کانستراکتور داشت و اون کانستراکتور ها فقط در بخش کوچیکی از کارها باهم تفاوت داشتن، میومدم و کدهارو چندبار کپی میکردم.
بعد ها اومدم اون قسمتی که بینشون مشترکه رو توی یه تابع دیگه قرار دادم و هرجا که نیاز بود اون رو صدا میزدم.
نمیدونستم که سی++ یه قابلیتی داره به اسم constructor delegation
فرض کنیم همچین کدی داریم:
class Foo
{
public:
Foo()
{
// code to do A
}
Foo(int value)
{
// code to do A
// code to do B
}
};
همونطور که میبینیم، کد کانستراکتور اولی توی کانستراکتور دومی کپی شده. برای اینکه از اینکار جلوگیری کنیم، از قابلیت delegate کردن کانستراکتور ها استفاده میکنیم و کد ما این شکلی میشه:
class Foo
{
private:
public:
Foo()
{
// code to do A
}
Foo(int value): Foo{} // use Foo() default constructor to do A
{
// code to do B
}
};
توی این کد وقتی کانستراکتور دومی صدا زده میشه، اول میاد و کانستراکتور اولی رو صدا میزنه و بعد میره کد های مربوط به خودش رو اجرا میکنه (: خیلیم قشنگ. به کانستراکتور دومی اصطلاحا میگن delegator.
نکات
- امکان اینکه کانستراکتور A یک delegate برای کانستراکتور B باشه و همین کانستراکتور B یک delegate برای کانستراکتور A باشه وجود داره. این باعث میشه که برنامه شما کرش کنه. پس باید مراقب باشیم که حلقه بی نهایت پیش نیاد.
- کانستراکتوری که delegator هست نمیتونه عمل member initialization رو انجام بده. در حالت کلی، یک کانستراکتور نمیتونه همزمان هم initializer باشه و هم delegator.