Seite 1 von 1

typeid mit Qt Objekten wirft eine exception

Verfasst: 6. August 2005 20:06
von gil
Hallo,

Ich habe ein Problem mit dem rtti feature unter Windows.

Ich habe Qt mit dem Intel C++ 8.1 kompiliert mit den folgenden Kommandos (Man sieht, daß rtti durch -GR angeschaltet ist!):

icl -c -nologo -Zm200 -W3 -MD -GX -GX -GR -DUNICODE -DQT_DLL
-DQT_THREAD_SUPPORT -DQT_NO_DEBUG -I"C:\Qt\3.3.4\include" -I"."
-I"tmp\moc\release_mt_shared" -I"C:\Qt\3.3.4\mkspecs\win32-icc"
-Fotmp\obj\release_mt_shared\ @C:\DOKUME~1\user\LOKALE~1\Temp\nm84.tmp
main.cpp

link /NOLOGO delayimp.lib /DELAYLOAD:comdlg32.dll
/DELAYLOAD:oleaut32.dll /DELAYLOAD:winmm.dll /DELAYLOAD:wsock32.dll
/DELAYLOAD:winspool.dll /DELAYLOAD:opengl32.dll /SUBSYSTEM:windows
/LIBPATH:"C:\Qt\3.3.4\lib" /OUT:aclock.exe
@C:\DOKUME~1\user\LOKALE~1\Temp\nm85.tmp

Die Bibliothek und das Beispiel aclock funktionieren einwandfrei.

Nun habe ich folgende Zeilen hinzugefügt, die RTTI benutzen:

QRadioButton *button = new QRadioButton(0,"TestButton");
char name[1024];
sprintf( name, "\"%s\" \"%s\" (\"%s\")",
button->name(), button->className(),
typeid( *button ).name() );
clock->setCaption(name);

Der Aufruf typeid(*button) failed mit der folgenden Nachricht:

"Runtime Error!
..
This application has requested the Runtime to terminate it in an unusual
way. Please contact the application's support for more information."

Visual Studio liefert eine non_rtti_object exception. Die Aufrufe typeid(button) und typeid(*clock) dagegen arbeiten korrekt!

Was habe ich falsch gemacht? Kann mir jemand bitte helfen?

Danke im Vorraus,
Gil

Verfasst: 7. August 2005 02:41
von lepsai
Hm, ein interessantes Problem... ich benutze auch typeid() und habe eigentlich keine Probleme, auch mit Intel comp. Ich würde vermuten, dass das Problem bei der Dereferenzierung von button entsteht, allerdings ist dann nicht zu erklären, warum es bei typeid(*clock) funktioniert....

Verfasst: 7. August 2005 20:10
von gil
Das Problem entsteht auch wirklich nur unter Windows. Unter Linux habe ich den Fehler nicht!

Ich will eigentlich auch dynamic_cast<QRadioButton*>(button) benutzen. Das wiederum benutzt allerdings typeid(*button) oder zumindest die gleiche Funktionalität und führt damit zur Exception.

Lepsai, kommst Du dazu, das mal so bei Dir auszuprobieren?

Danke, Gil

Verfasst: 7. August 2005 20:21
von lepsai
moment...

Verfasst: 7. August 2005 20:28
von lepsai
Also bei mir kein Problem bei folgendem Code:

QPushButton * tt = new QPushButton(&plot);
QString str = typeid(*tt).name();


Ich hab allerdings grade keinen intel.Com. installiert. ansonsten VC 6.0 SP 6, Qt 3.3.4, Microsoft Plattform SDK 2003, In VS 6 in Project Settings-> C++-> C++ Language-> Enalbe RTTI - enabled und Enable Exception handling - enabled...

Läuft ohne Probleme...