PDA

View Full Version : سوال: ساخت تنها یک آبجکت از روی کلاس



ehsan_faal
دوشنبه 08 تیر 1394, 05:20 صبح
سلام.
من برای اینکه از روی یک کلاس فقط بشه یه نمونه ساخت کد زیر رو نوشتم.
منتها نمیدونم چرا متد مخرب مدام تکرار میشه.ایراد کارم کجاست؟

#ifndef HANDY_H
#define HANDY_H


class Handy
{
int FakeData=0;
Handy();
static Handy* Instance;

public:
static Handy getInstance(void);
void Information(void);
~Handy();

};

#endif // HANDY_H



#include "Handy.h"
#include <iostream>
Handy* Handy::Instance=nullptr;
Handy::Handy()
{
using namespace std;
cout<<"Constructor Called."<<endl;
}
Handy::~Handy()
{
using namespace std;
cout<<"Destructor Called."<<endl;
delete Instance;
}

Handy Handy::getInstance(void)
{
if(Instance==nullptr)
{
Instance=new Handy;
return *Instance;
}
else
return *Instance;
}
void Handy::Information(void)
{
std::cout<<"blah blah blah..."<<std::endl;
}



#include <iostream>
#include "Handy.h"

using namespace std;

int main()
{
{
Handy Obj=Handy::getInstance();
Obj.getInstance();
Obj.Information();
}

system("pause");
return 0;
}



آیا اشکال توی تعریف متد مخربه؟(نباید حافظه اختصاص داده شده به نمونه رو delete کنم؟)
و سوال بعدیم هم اینه که توی مد دیباگ وقتی که اولین بار نمونه میسازم نمونه یه جورایی مثله لیست پیوندی میشه.(تصویر زیر)
در این مورد مشکل از چیه؟(خودم فکر میکنم این یه موردش درست باشه،چون یه متغیر استاتیک داریم اینجوری میشه دیگه،اینطور نیست؟)
132712

با تشکر

rahnema1
دوشنبه 08 تیر 1394, 14:28 عصر
سلام
این کلاس برای شما شیء یکتا ایجاد نمی کنه
توی عبارت زیر دو تا شیء ایجاد می شه

Handy Obj=Handy::getInstance();

ابتدا توسط getInstance یک شیء در heap ایجاد می شه و سپس توسط «سازنده کپی پیش فرض» این شیء در obj کپی می شه که یک شیء در stack خواهد بود بعد هم obj را می تونیم تو صد تا شیء دیگه کپی کنیم
همون بهتر که توسط getInstance اشاره گر برگردونده بشه
حالا اگه getInstance اشاره گر هم برگردونه باید سازنده های کپی و انتقال را هم از دسترس خارج کنید
مثلا سازنده کپی پیش فرض را به این صورت می تونیم از دسترس خارج کنیم
Handy(const Handy&)=delete;
علت اینکه مخرب به صورت بازگشتی صدا زده می شه اینکه که وقتی Instance بخواد delete بشه دو باره مخرب صدا زده می شه و همین جور ادامه پیدا می کنه که برای حل اون می شه اینجور نوشت

if(Instance == this)
delete Instance;