وراثت در Singleton - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وراثت در Singleton

+1 امتیاز
ما همیشه کلاسی Singleton تعریف می کنیم و شروع می کنیم کلاس اصلی خودمون را با این ترکیب می کنیم من قصد دارم چندین کلاس Singleton داشته باشیم و هر بار Singleton را پیاده سازی نکنم Singleton بگونه ای باشه که با وراثت ازش استفاده کنیم.
سوال شده اردیبهشت 7, 1399  بوسیله ی Mad (امتیاز 245)   10 35 47

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام؛ می‌توانید به این‌صورت کلاسی را تعریف کنید:

template <typename Class,
     typename T = std::enable_if<std::is_class_v<Class>>>
struct singleton
{
public:
    static Class* get_instance(void)
    {
        if (!object)
        {
            object = new Class;
        }
        return object;
    }

protected:
    static Class* object;
    singleton(void) = default;

private:
    singleton(const singleton&) = delete;
    singleton& operator=(const singleton&) = delete;
};
template <typename Class, typename T>
Class* singleton<Class, T>::object{nullptr};

 

و برای کلاس‌های دیگه از یک تابع make استفاده بکنید برای ساختن شئ:

struct some_base_class : public singleton<some_base_class>
{
private:
    size_t m_variable;

public:
    static auto make(const size_t var)
    {
        auto o{singleton<some_base_class>::get_instance()};
        o->m_variable = var;

        return o;
    }
};

 

پاسخ داده شده اردیبهشت 8, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
انتخاب شد اردیبهشت 8, 1399 بوسیله ی Mad
ممنون از پاسخ خوب شما .اگر متد make در کلاس some_base_class  را حذف کنیم هم می تونیم از کلاس استفاده کنیم لزومی بر بودنش نیست؟
من عذرخواهی می‌کنم که بی‌دقّت بودم توی پاسخ به این سوأل. الآن که کمی بیشتر دقّت کردم دیدم واقعاً نمیشه که چنین کلاسی درست کرد و برای اینکه اطمینان حاصلم کنم توی StackOverFlow هم پرسیدم که می‌تونید جوابش رو اینجا مشاهده کنید :
https://stackoverflow.com/questions/61482046/how-to-make-default-constructor-private-in-base-class#61482305

وقتی ما سازندهٔ پیش‌فرض کلاس را داخل کلاس پایه با دسترسی prinvate تعریف می‌کنیم یعنی اینکه دیگه نمی‌شه از اون کلاس شئ ساخت پس کامپایلر اون سازنده رو حذف می‌کنه و از این رو نمی‌تونیم یه همچین کلاسی داشته باشیم.
...