PDA

View Full Version : سوال: دلیل استفاده زیاد از new در کیوت چیست؟



motherboard
دوشنبه 09 تیر 1393, 14:33 عصر
سلام.یک سوالی داشتم و اون اینه که در مثال های کیوت خیلی خیلی از همچین ساز و کاری استفاده میشه:

QAb *a= new QAb;
a->t();
a->show();

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

QAb a;
a.t();
a.show();

راستش نمیدونم علت استفاده زیاد از حالت اولی چیه؟ و خیلی تفاوت این دو نوع روش رو هضم نکردم.هر دو تا روش رو بلد هستم اما اینکه چرا تو مثال های کیوت خیلی زیاد از روش اولی استفاده میشه رو متوجه نیستم؟

کامبیز اسدزاده
دوشنبه 09 تیر 1393, 16:01 عصر
سلام.یک سوالی داشتم و اون اینه که در مثال های کیوت خیلی خیلی از همچین ساز و کاری استفاده میشه:

QAb *a= new QAb;
a->t();
a->show();

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

QAb a;
a.t();
a.show();

راستش نمیدونم علت استفاده زیاد از حالت اولی چیه؟ و خیلی تفاوت این دو نوع روش رو هضم نکردم.هر دو تا روش رو بلد هستم اما اینکه چرا تو مثال های کیوت خیلی زیاد از روش اولی استفاده میشه رو متوجه نیستم؟

به Qt مربوط نیست کلا در C++‎‎‎‎‎‎‎‎‎‎‎‎ دست یابی مستقیم و غیر مستقیم وجود داره که در روش اول با مشتق گیری و خواندن اون به صورت غیر مستقیم از طریق آدرسش در حافظه بهش دسترسی دارید و در مثال دوم به صورت مستقیم دسترسی پیدا میکنید که اصولا روش اول بهینه تر و قابل دسترس تر هستش.

فرق کلی هم اینه اگر از روش دوم استفاده کنید بعد از اجرا شدن اطلاعات از حافظه پاک میشه ! ولی در روش اول خیر در حافظه باقی خواهد ماند و دسترسی از طریق آدرس موجود بر روی حافظه امکان پذیر خواهد بود.

یعنی اگه با روش دوم شما فرمی رو صدا بزنید همین که اجرا بشه دوباره ارتباط شما از بین رفته و فرم بسته خواهد شد ولی در روش اول چنین نیست فرم شما تا زمانی که دستور حذف و خروج از آدرس رو ندین قابل نمایش خواهد بود چرا چون از طریق شناسه موجود در حافظه ای که براش تخصیص دادین بهش دسترسی دارید.


یک مثال میزنم تا روشنتر بشید :


Form FR;
FR.show();


در این کد من یه نمونه از فرم موجود میسازم و بعد دستور نمایش رو میدم خب در این حالت وقتی برنامه رو اجرا کنید این دستور اجرا میشه ولی سریع به پایان میرسه یعنی فرم نمایش و سپس نا پدید خواهد شد ! دلیلش اینه که شما بعد از کامپایل آدرستون از حافظه پاک میشه و این روش برای نمایش و صدا زدن مثلا یک فرم مناسب نیست برای حل این مشکل روش زیر کارسازه...


Form *FR = new Form;
FR->show();


حالا اینجا چه کار کردیم... یک نمونه جدید توسط آدرس موجود در حافظه برای این فرم در نظر گرفتیم پس در نتیجه وقتی برنامه کامپایل و اجرا شد هنگام اجرای این دستور شما چون دسترسی غیر مستقیم یعنی توسط آدرس مختص برای این فرم در حافظه دارید بهش دسترسی خواهید داشت.حالا دلیل استفاده از new برای ساختن یک نمونه جدید اجبار است ! یعنی بدون عملگر new شما نمیتونید حافظه ای رو برای گزینه مورد نظر خودتون تخصیص بدین. همه اینها مربوط به C++‎‎‎‎‎‎‎‎‎‎‎‎ هست و به Qt هیچ ربطی نداره.