ورود

View Full Version : سوال: static_cast در تبدیلات event ها



chikar
دوشنبه 01 تیر 1394, 18:47 عصر
طبق جستجو هایی که من کردم مثلا در این لینک (https://msdn.microsoft.com/en-us/library/c36yw7x9.aspx)و بسیاری از لینک های دیگه، برای تبدیل یک اشاره گر از کلاس والد به یک اشاره گر از کلاس فرزند، روش dynamic_cast رو مناسب تر می دونند و استفاده از static_cast با وجوی که امکانپذیر هست ولی "ناامن" توصیف شده، پس چرا کیوت از این روش تبدیل برای event ها استفاده می کنه؟
مگه تبدیل با dynamic_cast از نوع تبدیل run-time محسوب نمی شه و static_cast از نوع تبدیل compile-time ، پس برای event ها که روش run-time به ظاهر مناسب تر به نظر میاد؟

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouse = static_cast<QMouseEvent*>(event);
return true;
}
return QMainWindow::eventFilter(obj,event);
}

حامد مصافی
سه شنبه 02 تیر 1394, 09:09 صبح
static_cast برای تبدیل صریح به کار میره. برای مثال float به int. در عین حال می‌تونه انواع مشتق شده رو به هم تبدیل کنه. برای مثال اگر کلاسی به نام a داشته باشیم و کلاسی به نام b که از a مشتق شده. به استفاده از static_cast می‌تونیم آبجکتی از نوع b رو تبدیل به نوع a کنیم. static_cast در تبدیل رو به بالا همیشه به درستی عمل می‌کنه. اما عکس این موضوع همیشه صادق نیست. اگر شما بخواهید شیئی از نوع a رو تبدیل به نوع b کنید، static_cast واقعاً سعی می‌کنه این کار رو برای شما انجام بده، دستش درد نکنه اما ممکنه این آبجکت در واقع از نوع b نباشه. به همین دلیل ممکنه یک خطای منظقی در استفاده از اون رخ بده. در سمت مقابل dynamic_cast متحصص امور چند ریختیه. اون به صورت هوشمندانه سعی می‌کنه نوع مورد نظر رو در پیاده سازی شی پیدا کنه و اونو برگردونه، در صورتی که موفق به این کار نشه یک NULL برای شما برمیگردونه. معمولاً تا جایی که من در رفرنس‌ها دیدم گفته میشه static_cast باید اولین انتخاب شما باشه. مگر اینکه شما از ماهیت نوع آبجکت به طور قطع مطمئن نیستید. در تبدیلات event عمل cast بعد از بررسی Type صورت میگیره. پس میشه گفت ما از ماهیت آبجکت اطمینان حاصل می‌کنیم. اما در سایر موارد چند ریختی بهتره از dynamic_cast استفاده کنیم.