PDA

View Full Version : سوال: کلاس singleton و سازنده private



aliv.2022
جمعه 30 آبان 1393, 14:07 عصر
سلام
2تا سوال دارم که ممنون میشم کسی راهنماییم کنه
یکی این که کلاس سینگلتون چیه؟ کاربردش چیه؟ چطور تعریف میکننش؟
یکی هم این که اگه سازنده(constructor) کلاس رو private تعریف کنیم، چه خاصیتی داره و چه کاربردی؟ فرقش با singleton چیه؟ و با static!!

omid_kma
جمعه 30 آبان 1393, 14:35 عصر
کلاسی هست که فقط یک شی میشه ازش ساخت
نحوه تعریف این جا هست http://www.7khatcode.com/249/%DA%A9%D9%84%D8%A7%D8%B3%DB%8C-%DA%A9%D9%87-%D9%81%D9%82%D8%B7-%DB%8C%DA%A9-%D8%B4%DB%8C-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%B3%D8%A7%D8%AE%D8%AA%D9%87-%D8%B4%D9%88%D8%AF
متغیر static هم متغیری هست که زمان رسیدن برنامه به تعریف مقدار می گیره و تا اتمام برنامه هم حافظش پایداره . و این که اگر متغیر بصورت global و static تعریف شده باشه scope اش محدود تر میشه.

تعریف سازنده بصورت private هم برای این هست که نشه دیگه با استفاده از اون سازنده شی ساخت و ربطش به singleton هم این هست که برای ساخت singleton سازنده رو private تعریف می کنن تا از ساخت شی جلوگیری کنن

aliv.2022
جمعه 30 آبان 1393, 15:04 عصر
خب من بیشتر مشکلم با این بود که وقتی تو singleton سازنده privateه، چطوری همون یه شی رو میسازیم؟ که با لینک یه مقدار رفع ابهام شدم!!:قلب: ممنون ولی اگه خودتونم یکم توضیح میدادین ممنون میشدم!:افسرده:

omid_kma
جمعه 30 آبان 1393, 16:00 عصر
خب من بیشتر مشکلم با این بود که وقتی تو singleton سازنده privateه، چطوری همون یه شی رو میسازیم؟ که با لینک یه مقدار رفع ابهام شدم!!:قلب: ممنون ولی اگه خودتونم یکم توضیح میدادین ممنون میشدم!:افسرده:

#include <iostream>


class Singleton
{
public:
static Singleton& getInstance() {
static Singleton instance;


return instance;
}
private:
Singleton() { }
void operator=(const Singleton& other){}
Singleton(const Singleton& other){}//copy constructor
};




int main()
{
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
std::cout << &s1 << '\n';
std::cout << &s2 << '\n';
}

با دیدن کد بالا این چند تا سوال پیش میاد :

چرا متغیر instance داخل کلاس static تعریف شده ؟
دلیل این هست که در کلاس singleton شی باید فقط یکبار ساخته بشه و تا آخر برنامه پاک نشه .

کار تابع getInstance چیه ؟
این تابع اولین باری که صدا زده میشه یک شی از کلاس Singleton رو میسازه و اونو بر می گردونه و دفعات بعدی همون شی که قبلا ساخته شده برگشت داده میشه .

دلیل تعریف operator= و copy constructor داخل private چی هست؟
دلیل این هست که از انجام عبارتی به این شکل جلوگیری بشه s1=s2 .

چرا تابع getInstance به شکل static هست ؟
اگر تابع عضو کلاس static باشه خارج از کلاس امکان صدا زدن اون تابع بدون ساخت شی از کلاس وجود داره .

اگر سازنده private هست چطور میشه داخل تابع getInstance ازش استفاده کرد ؟
private بودن سازنده و توابع عضو کلاس به این معنی هست که از خارج از کلاس قابل دسترسی نیستند ولی استفاده از توابع private داخل توابع خودکلاس مجاز هست پس ساخت شی از کلاس داخل getInstance مجاز هست .

چرا سازنده private هست؟
دلیل این هست که از ساخت شی خارج از کلاس جلوگیری بشه .

دلیل cout کردن چی هست ؟
دلیل این هست که ببینید که آدرس هر 2 تا شی s1 , s2 یکی هست و فقط یک شی ساخته شده .

امیدوارم با این توضیحات نحوه کار این کلاس براتون جا بیفته .

aliv.2022
دوشنبه 03 آذر 1393, 10:35 صبح
ممنون! واقعا جامع بود! :لبخندساده: