PDA

View Full Version : مشکل در استفاده از typeid



mr_esmaily
پنج شنبه 23 تیر 1384, 15:47 عصر
سلام
یه کلاس تجریدی بنام employee پیاده سازی شده که دارای حداقل یه تابع مجازی محض هست.
از کلاس employee کلاسی بنام manager درایو کردم.
حال در بدنه تابع ()main یه اشاره گر از نوع employee ساختم و به آن آدرس یه نمونه از manager رو نسبت دادم. بدین صورت :

employee * emp=new manager("Dan","Booth");
مشکل در خط زیر بُروز می کند :

if(typeid(*emp)==typeid(manager))
cout << "class Manager" << endl;

هنگام کامپایل خطایی بُروز داده نمیشه ولی هنگام اجرا با خطای زیر مواجه میشم :

An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in My Project 4.exe

Additional information: External component has thrown an exception.

غیر از مشکل فوق هنگام خروج از تابع ()main , هنگامی که می خوام فضای اشغال شده رو توسط خط زیر آزاد کنم :

delete emp;
با خطای زیر روبرو میشم :

DAMAGE : after Normal block (#47) at 0*030C4D10.

Blaster
پنج شنبه 23 تیر 1384, 17:15 عصر
برای استفاده از typeid باید RTTI رو تویه تنضیمات پروژه فعال کنی.

mr_esmaily
پنج شنبه 23 تیر 1384, 18:00 عصر
سلام
کد زیر بدون مشکل اجرا می شود :

cout << "Type: " << typeid(emps).name() << endl;
ولی همونطور که در بالا گفتم در کد :

cout << "Type: " << typeid(*emps).name() << endl;
به مشکل بر می خورم.


برای استفاده از typeid باید RTTI رو تویه تنضیمات پروژه فعال کنی.
بیشتر توضیح بدین لطفاً.

Blaster
جمعه 24 تیر 1384, 10:26 صبح
RTTI یا همون RunTime Type Information به شما اجازه میده که از عملگر typeid استفاده کنید .
در حقیقت با اضافه کردن اطلاعاتی به تعاریف کلاسها این کار رو انجام میده.
برای فعال کردن RTTI :


Project Setting > C/C++ Tab > Category C++ Language

mr_esmaily
جمعه 24 تیر 1384, 11:55 صبح
سلام
مرسی حل شد , اما در کامپایلر های دیگر مثل توربو ++c چطور عمل میشه؟

Blaster
شنبه 25 تیر 1384, 10:32 صبح
در کامپایلر های دیگه هم به همین شکل عمل میشه . ولی در بعضی از اونها به طور پیش فرض فعال هست.