PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Falscher virtual Function call


del_4901
2006-05-21, 21:25:52
Compiler MSVC 2005 (native C++)

Das sind die Tiefpunkte im Leben eines jeden Programmierers.

Ich hab schon versucht das Konstukt nachzustellen, aber da läuft es. Ich hab einen Ableitungsbaum mit mehreren virtuellen Funktionen.

object
|
------------------------------------------------------------------------------
| | | | | |
gfxobject queue Renderer camera Event Guardian
| | |
----------- pointedcam -------------------
| | | | |
nprimetiv light Keyboard Mouse ...
|
pointlight


alle erben von object:
virtual void handle() = NULL; (ist nur in object abstrakt)

einige noch "unfertige" Klassen besitzen nur sowas:

virtual void handle(){}


das tolle an der ganzen sache ist, es hat solange funktioniert, bis ich die handel-funktionen in den Events ausformulieren wollte. Jetzt called er mir immer die falsche Funktion ... z.B im Debug build called er mir handle() aus Event. Im Releasebuild called er mir handel() aus queue.
Wenn ich Queue nicht von object erben lass called er mir im Releasebuild handle() von gfxobject.

er macht das sogar wenn ich handel kurz nach dem erzeugen des Events aufruf. Sprich der Zeiger hat noch den Typ von Keyboardevent etc. Da ist noch gar niks gecasted worden weder implizit noch anders.

Woran könnte das liegen?
den ganzen Code zu posten währ Hardcore und ich weiß auch nicht welche Abschnitte dafür verantwortlich sein könnten.
Und Nachstelln ist nicht, da läuft alles wunderbar.

und implzit auf object* casten hat auch niks gebracht (war auch nicht anders zu erwarten ^^)

del_4901
2006-05-21, 21:37:00
OK, jetzt hab ich in der entsprechenden Klasse die andern virtuellen Funktionen erstmal mit lehren Rümpfen ausgestattet.

Jetzt called er zumindestens im Debug build die richtige Funktion. über den Releasebuild reden wir besser nicht, da hat er ein neues Opfer gefunden ^^

Kranke Scheisse was geht?

Coda
2006-05-21, 22:17:31
Sicher das du nicht irgendwie wild im Speicher rumschreibst und dabei die VTable der Objekte korrumpierst?

ScottManDeath
2006-05-21, 22:26:08
Virtuelle Funktionen im Konstruktor aufrufen ist auch pöse ;)

Neomi
2006-05-21, 22:26:41
Ist irgendwo Multiple Inheritance im Spiel? Falls ja, hast du virtuelle Basisklassen verwendet?

del_4901
2006-05-22, 07:46:59
Ich hatte ein "virtual" vergessen in einem anderen Ableitungs-Ast. Das der compiler da nicht mecker macht ^^. Wenigstens ne Warning währe angesagt.
Außerdem hab ich ein paar überflüssige virtual functions entfernt.
Und die virtuals an den Anfang gesetzt.
Dafür hab ich delegates/funktoren in meine Eventhandler eingebaut.
Jetzt bin ich ziehmlich zufrieden, hab 125% rausgeholt, 150% währen nett, aber dafür muss erstmal mein Buch ankommen. ^^

Alles in allem hab ich die Engine gut "abspecken" können. ^^

del_4901
2006-05-22, 08:16:59
Coda[/POST]']Sicher das du nicht irgendwie wild im Speicher rumschreibst und dabei die VTable der Objekte korrumpierst?

Du traust mir auch immer das schlimmste zu ^^ hehe :)

Inzwischen bin ich so bewandert das ich mich nichtmehr verzeigere oder ein delete vergesse. Mein Zeigercode kompelltiert meißens sogar sofort ^^.

Ok, ich hab heute Nacht einmal ein new vergessen (das delete war schon da)
und wollte dann einen Nullzeiger casten, aber das ist mir schnell aufgefallen ^^

del_4901
2006-05-22, 08:17:30
ScottManDeath[/POST]']Virtuelle Funktionen im Konstruktor aufrufen ist auch pöse ;)

Das hab ich heute Nacht in ettlichen Dokus auch gefunden ... immer gut zu wissen ^^

del_4901
2006-05-22, 08:18:28
Neomi[/POST]']Ist irgendwo Multiple Inheritance im Spiel? Falls ja, hast du virtuelle Basisklassen verwendet?

Die versuch ich zu vermeiden.. Bei meiner ganz neuen Kreation ließ sich das nicht vermeiden, aber das war noch vor dem Vorfall.

micki
2006-05-22, 10:40:20
AlphaTier[/POST]']:

virtual void handle(){}


manchmal hat mir das VS.Net03 bei funktionen die im header definiert wurden auch scheisse beim call gebaut (frag mich nicht warum), jedenfalls lief das nachdem ich die implementierung in die cpp geschoben habe.

sind deine ableitungen über mehrere module (DLLs) verteilt?

del_4901
2006-05-23, 01:47:06
Nein so groß ist das Programm noch nicht. Ich hab erstmal nur die komplette Fixed-Pipeline Funktionallität (ohne Extensions) eingebaut. Als nächstes kommen MaterialTrees und Shaderinterfaces. Dann ein ColladaParser (hat da jemand ein gutes Tut?) Einsprechende DatenStrukturen für die Welt. VBOs FBOs ... und dann hohl ich aber so langsam aber sicher meine Gems raus ^^.