![]() |
Delphi-Version: 7
Ergebnis des geerbten Konstruktors verschwindet wieder
Liste der Anhänge anzeigen (Anzahl: 1)
ich habe ein sehr ungewöhnliches Problem:
Einige Klassen, die aufeinander aufgebaut sind: TBase <- TEditable <- TTriggerBase <- [TTriggerA, TTriggerB] TTriggerA wird in einem Projekt verwendet und alles läuft gut. TTriggerB wird in einem anderen Projekt verwendet, da tritt folgendes Verhalten auf: Der Konstruktor von TTriggerBase füllt die Daten-Member, bei der Rückkehr zum Konstruktor von TriggerB werden diese Inhalte wieder gelöscht. Zur Lokalisierung des Fehlers habe ich eine statische Variable 'beingCreated: ' angelegt, die eine Referenz auf das konstruierte Objekt trägt. Steppt man nun durch die Konstruktoren, so fällt auf, dass sich zwar die Werte in self ändern, nicht aber die in 'beingCreated'. Dies gilt aber nur für die Werte in der Ebene TTriggerBase. Die Werte der Vorfahren TBase und TEditable erscheinen über beide Referenzen (s. Bild).
Delphi-Quellcode:
Hat jemand eine Idee, woran das liegen könnte und (vor allem) wie man das Verhalten korrigieren kann?
constructor TBase.Create();
begin inherited Create(); Inc(g_ObjectId); m_objId := g_ObjectId; m_Version := 1; end; constructor TEditable.Create(); begin inherited Create(); m_IsModified := false; end; constructor TTriggerBase.Create(id: Integer; name: String; wait: single; bCombineAll: Boolean; fehlerAktion: Integer); begin inherited Create(); m_TriggerID := id; m_Name := name; m_Timeout := wait; m_CombineAll := bCombineAll; m_FehlerAktion := fehlerAktion; m_Conditions := TObjectList.Create(false); m_Checks := TObjectList.Create(false); m_Nachfolger := TObjectList.Create(false); m_Vorgaenger := nil; end; // <<=== s. Grafik constructor TTriggerA.Create(id: Integer; name: String; wait: single; bCombineAll: Boolean; fehlerAktion: Integer); begin inherited Create(id, name, wait, bCombineAll, fehlerAktion); m_TimeActivated := 0; m_TimeTriggered := 0; m_isLogged := false; end; var beingCreated: TTriggerB; constructor TTriggerB.Create(id: Integer; name: String; wait: single; bCombineAll: Boolean; fehlerAktion: Integer); begin beingCreated := self; inherited Create(id, name, wait, bCombineAll, fehlerAktion); m_XPosition := 0; m_TimeTriggered := 0; m_DeletedObjects := TObjectList.Create(false); m_AddedObjects := TObjectList.Create(false); end; |
AW: Ergebnis des geerbten Konstruktors verschwindet wieder
Thema ist erledigt, nachdem auf andere Merkwürdigkeiten aufgetreten sind, ist mir endlich :oops: aufgefallen, dass in der abgeleiteten Klass die Datenfelder erneut deklariert waren.
Was mich aber schon wundert:
|
AW: Ergebnis des geerbten Konstruktors verschwindet wieder
Zitat:
Er nimmt einfach den vom Scope her am nächsten deklarierten. In so einem Fall (unerwarteter Inhalt einer Variablen) benenne ich die Variable einfach um und schaue wer da noch alles drauf zugreift. Dabei wäre dann aufgefallen, dass die abgeleitete Klasse weiter kompiliert. |
AW: Ergebnis des geerbten Konstruktors verschwindet wieder
Genau den Fall hatte ich neulich aber auch und mich ebenfalls geärgert, dass man hier wenigstens einen Hinweis bekommen könnte wenn man so einen Fehler macht.
Das wird man ja in den seltensten Fällen wirklich so wollen. |
AW: Ergebnis des geerbten Konstruktors verschwindet wieder
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz