typeid mit Qt Objekten wirft eine exception

Alles rund um die Programmierung mit Qt
Antworten
gil
Beiträge: 2
Registriert: 6. August 2005 19:41

typeid mit Qt Objekten wirft eine exception

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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....
gil
Beiträge: 2
Registriert: 6. August 2005 19:41

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

moment...
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
Antworten