PDA

View Full Version : استفاده از یک کلاس به صورت اشاره گردر تابع Main



Salah Sanjabian
چهارشنبه 10 فروردین 1390, 02:53 صبح
سلام .
دوستان یه سوال داشتم و اونم اینکه چرا ما به جای


int main(intargc,char*argv[])
{
QApplicationa(argc,argv); QLabel*Label=newQLabel("Sample");
Label->show();
returna.exec();
}

از این کد استفاده نمیکیم؟


intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
QLabelLabel("Sample");
Label.show();
returna.exec();
}

البته این سوال شاید فقط مربوط به کیوت نباشه ما تو ++C استاندارد هم میتونیم یه کلاس داشته باشیم و تو تابع main به دو فرم بالا بهش دست پیدا کنیم.ولی منی که فقط میخام تو تابع main از یه کلاس استفاده کنم،آیا باید اونو به صورت اشاره گر تعریف کنم؟

حامد مصافی
چهارشنبه 10 فروردین 1390, 09:41 صبح
کی گفته استفاده نمی‌کنیم؟ اتفاقا به کرات استفاده می‌کنیم.در تابع main طول عمر یک شی بیشتر از عمر خود تابع نیست پس می‌توانید آن را به هر صورتی که تمایل دارید تعریف کنید.

Salah Sanjabian
چهارشنبه 10 فروردین 1390, 13:17 عصر
ممنون از پاسختون.
اولین مثال کیوت روبه صورت فرم اول بیان کرده بود و مثال های زیادی رو دیدم که توتابع mainاز new استفاده کرده بود.

اینجارو داشته باشین

class MyWidget:public QWidget
{
public: MyWidget(QWidget *parent=0);
};
MyWidget::MyWidget(QWidget *parent) :QWidget(parent)
{
setFixedSize(200,120);
QPushButton *PushButton=new QPushButton(tr("Quits"),this); PushButton->setGeometry(64,40,75,30); PushButton->setFont(QFont("Tahoma",18,12)); connect(PushButton,SIGNAL(clicked()),qApp,SLOT(qui t()));
/*
QPushButton PushButton;
PushButton.setGeometry(64,40,75,30);
PushButton.setFont(QFont("Tahoma",18,12));
connect(&PushButton,SIGNAL(clicked()),qApp,SLOT(quit()));*/}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget Widget;
Widget.show();
return a.exec();
}

مااگه بخوایم توسط مکانیزم Slot و Signal اشیا رو به هم وصل کنیم ورودی یاهمون sender تابع connect مون باید به صورت اشاره گر باشه. درسته؟
دو نمونه کد گذاشتم که یکی QPushButton رو تو فضای هیپ بهش حافظه میده(new)و یکی تو استک.
ولی اونجایی که من به صورت استک تعریف کردم من آدرس QpushButton رو به تابع connect پاس میدم ولی خوب نتیجه ای که بهم میده اشتباست و مثله کداول عمل نمیکنه

Salah Sanjabian
چهارشنبه 10 فروردین 1390, 13:20 عصر
......................

حامد مصافی
چهارشنبه 10 فروردین 1390, 13:55 عصر
شما در این مثال «قسمت کامنت» در سازنده MyWidget یک QPushButton تعریف کرده‌اید و توجه داشته باشید بعد از اجرای سازنده MyWidget این شی (QPushButton) از بین می‌رود.
سازنده MyWidget یک متد موقت است اما به این نکته توجه داشته باشید متد main تنها متدی است که در تمام طول اجرای برنامه دوام دارد. پس تعریف در تابع main را با یک متد موقت مانند سازنده MyWidget اشتباه نگیرید.
به عبارت ساده‌تر اگر قرار است شی جدید به طوری تعریف کنید که در تمام طول اجرای برنامه دوام داشته باشد باید یک اشاره‌گر با آن شی (در heap) ایجاد کنید یا اینکه نمونه‌ای از شی (در stack) را فقط در تابع main تعریف کنید.

Salah Sanjabian
چهارشنبه 10 فروردین 1390, 14:56 عصر
ممنون از توضیحاتتون.:لبخندساده:


class MyWidget:public QWidget
{
public: MyWidget(QWidget *parent=0);
private: QPushButton *PushButton;
};
MyWidget::MyWidget(QWidget *parent) :QWidget(parent)
{
setFixedSize(200,120);
PushButton=new QPushButton("Quits",this); PushButton->setGeometry(64,40,75,30); PushButton->setFont(QFont("Tahoma",18,12)); connect(PushButton,SIGNAL(clicked()),qApp,SLOT(qui t())); }

تو کدبالا اگه ویدجتمون(MyWidget)رو به عنوان parent باتونمون تعریف نکنیم باز نتیجه ای نمیگیریم
یعنی اگه به این صورت باشه

PushButton=new QPushButton("Quits");
در حالی که ما button رو به صورت اشاره گر در قسمت Private تعریف کردیم
یعنی تا وقتی که ویدجتمون زنده ست این کار اتفاق بیفته و به محض این MyWidget تموم شد QpushButton هم از بین بره؟
باتشکر.

حامد مصافی
چهارشنبه 10 فروردین 1390, 23:05 عصر
تو کدبالا اگه ویدجتمون(MyWidget)رو به عنوان parent باتونمون تعریف نکنیم باز نتیجه ای نمیگیریم
طبیعیه عزیز من

وجود یک شی در یک کلاس با نمایش دادن اون شی در ظاهر کلاس دو مقوله مجزا از هم هستند.

در کیوت وقتی یک widget والدی(parentWidget) ندارد نمایش داده نخواهد شد مگر اینکه متد show برای آن widget فراخوانی شود که در این حالت یک پنجره برای آن ایجاد خواهد شد که بحث جداگانه‌ای است. در حالتی که شما بیان فرمودید شی در heap وجود دارد اما در مونیتور نمایش داده نمی‌شود