Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - überkreuzender Bezug zweier Units
|\/|_/\_>< - Di 19.04.05 10:13
Titel: überkreuzender Bezug zweier Units
Hallo,
ich habe folgendes Problem:
Ich würde gerne eine Reihe von Klassen schreiben, die sich recht komplex gegenseitig aufeinander beziehen.
D.h. ich habe beispielsweise eine Klasse A, die eine Objekt vom Typ Klasse B enthählt, aber auch eines von Klasse A. Dabei soll aber auch B wieder ein Objekt von Klasse A enthalten können.
Kann mir jemand erklären, die der dazugehörige Definitionscode aussieht?
Ich habe gehört, dass das vielleicht irgendwie über ein sog. 'Interface' geht?!
Danke!
Gruß Max
Moderiert von
Tino: Topic aus Sonstiges verschoben am Mi 20.04.2005 um 08:00
jaenicke - Di 19.04.05 10:42
Ich nehme mal an, dass du mit interface den entsprechenden Teil einer Delphi-Unit meinst.
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| interface
type TApfel = class;
TBirne = class private a: TApfel; public procedure Test; end; TApfel = class private b: TBirne; public procedure Test; end;
implementation
procedure TBirne.Test; begin
end;
procedure TApfel.Test; begin
end; |
Allerdings hat das nix mit überkreuzenden Units zu tun, denn die Klassen müssen ja nicht in verschiedenen Units deklariert werden. (das würde die Sache wahrscheinlich unnötig verkomplizieren...)
|\/|_/\_>< - Di 19.04.05 11:30
danke schonmal,
aber irgendwie bekomme ich gleich in der zweiten Zeile eine Fehlermeldung:
Delphi-Quelltext
1: 2:
| interface TApfel = class; |
Deklaration erwartet, aber Bezeichner 'TApfel' gefunden.
|\/|_/\_>< - Di 19.04.05 12:20
Außerdem habe ich in meinem Code kleine Unterschiede - kann das damit zusammenhängen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| interface
uses ...; TApfel = class;
type TBirne = class private a: TApfel; public procedure Test; end; type TApfel = class private b: TBirne; public procedure Test; end;
implementation
procedure TBirne.Test; begin
end;
procedure TApfel.Test; begin
end; |
Komm da irgendwie nicht weiter. :(
Bin für jede Hilfe dankbar.
Keldorn - Di 19.04.05 12:32
bei der Forward deklaration ist nur innerhalb einer type-Angabe erlaubt und deine Forwarddeklaration steht auch ohne type da
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TApfel = class; TBirne = class private a: TApfel; public procedure Test; end; TApfel = class private b: TBirne; public procedure Test; end; |
Mfg frank
jaenicke - Di 19.04.05 13:17
@Keldorn: Ich glaube nicht, dass "|\/|_/\_><" weiß, was eine forward deklaration ist...
Zur Erklärung:
Da innerhalb von TBirne auf TApfel zugegriffen wird, muss der Compiler schon vorher wissen, dass die Klasse TApfel existiert. Daher deklariert man schonmal die Klasse TApfel, formuliert sie aber noch nicht vollständig. Das macht man dann etwas später im Quelltext.
Diese erste Deklaration von TApfel nennt man dann forward deklaration.
(Ich habe meinen ersten Quelltext geändert, jetzt stimmt er, die Änderung ist markiert.)
Keldorn - Di 19.04.05 13:20
jaenicke hat folgendes geschrieben: |
@Keldorn: Ich glaube nicht, dass "|\/|_/\_><" weiß, was eine forward deklaration ist...
|
Dafür gibts auch eine OH ;), da gibts eine Punkt "Vorwärtsdeklarationen und voneinander abhängige Klassen"
|\/|_/\_>< - Di 19.04.05 13:21
danke - so geht's jetzt! :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!