کلاسی که فقط یک شی از آن ساخته شود - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

کلاسی که فقط یک شی از آن ساخته شود

+2 امتیاز
سلام دوباره

راهی هست من کلاسمو جوری بنویسم که فقط یک شی ازش بتونم بسازم ؟
سوال شده آذر 7, 1392  بوسیله ی رامین قربانی (امتیاز 75)   5 11 15
دوباره تگ گذاری شد خرداد 19, 1394 بوسیله ی BlueBlade

5 پاسخ

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

به این نوع کلاس سینگلتون (Singleton) اطلاق میشه.

 یک متغیر static توی کلاس تعریف کنید و پس از اولین نمونه که ساخته میشه بهش مقدار بده دفعه بعد اگر اون متغیر استاتیک مقدار داشته باشه دیگه construcotr کار نکنه. 

#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';
}

 

پاسخ داده شده آذر 7, 1392 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ویرایش شده تیر 26, 1394 بوسیله ی مصطفی ساتکی
+2 امتیاز

سلام.
برای ساختن کلاس فقط از یک تابع مخصوص استفاده کنید که براش شمارنده تعیین میکنید. و برای delete کردن کلاس هم از تابع مخصوص استفاده کنید که همیشه فقط به تعدادی که میخواید آبجکت بتونه ساخته شه.
با تغییر مکروی MAX_NUM_OF_OBJ میتونید تعیین کنید که چه تعداد آبجکت میتونه ساخته بشه. می تونید این پارامتر رو به شکل متغیر تعریف کنید و هر جا لازم شد ماکسیمم رو عوض کنید.
 

typedef class TMyClass
{

} *PMyClass;

#define MAX_NUM_OF_OBJ 1

static int NumOfObj = 0;

TMyClass * CreateMyClass(TMyClass ** ppOut)
{

    if (NumOfObj < MAX_NUM_OF_OBJ)
    {
        *ppOut = new TMyClass();
        NumOfObj++;
        return ppOut ;
    }
    else
        return (*ppOut = NULL);
};

void DeleteMyClass(TMyClass * ppC)
{
    if (ppC != NULL)
    {
        delete (ppC);
        NumOfObj--;
    };
};

 

پاسخ داده شده آذر 7, 1392 بوسیله ی محمد قدیانی (امتیاز 317)   1 9
ویرایش شده آبان 30, 1393 بوسیله ی BlueBlade
–2 امتیاز

من این روش رو امتحن کردم. به نظرم درست کار میکنه اما نمیدونم روش درستی هست یا نه:

typedef class TMyClass
{
    static int Counter;
public:
    TMyClass()
    {
        if (Counter > 0)
        {
            delete this;
            return;
        };
        Counter++;
    };
} *PMyClass;

int TMyClass::Counter = 0;

 

پاسخ داده شده آذر 8, 1392 بوسیله ی محمد قدیانی (امتیاز 317)   1 9
نه اشتباهه این کد undefined bahavior ه
http://stackoverflow.com/questions/5303608/delete-this-in-constructor
–2 امتیاز

classi ke az an beshe ye shay sakht kole mafhome shaygarai ro zire soal mibare :) age ye shay az chizi mikhay bedone shaygari benvis

پاسخ داده شده دی 22, 1392 بوسیله ی Armin Mokri (امتیاز 7)   3
نه زیر سوال نمی بره شما فرض کن یک کلاس داری که وظیفش درست کردن log فایل هستش این کلاس حتما باید یک شی ازش ساخته بشه تا درست کار کنه یا مثلا یک کلاس که وظیفه مدیریت thread های برنامه رو داره . توی C# - جاوا هم کلاس هایی به شکل static هستن که اصلا ازشون شی نمیشه ساخت .
0 امتیاز
class Singleton final {
	public:
		static Singleton& getInstance() {
			static Singleton theInstance{};
			return theInstance;
		}
		int doSomething() {
			return 42;
		}
		// ...more member functions doing more or less useful things here...
	private:
		Singleton() = default;
		Singleton(const Singleton&) = delete;
		Singleton(Singleton&&) = delete;
		Singleton& operator=(const Singleton&) = delete;
		Singleton& operator=(Singleton&&) = delete;
		// ...
	};

 

پاسخ داده شده اردیبهشت 27, 1398 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
...