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 user profile iconTino: 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 //edited: das type hat gefehlt
  TApfel = class;

  TBirne = class
  private
    a: TApfel;
  public
    procedure Test;
  end;
  
  TApfel = class
  private
    b: TBirne;
  public
    procedure Test;
  end;

//(...)

implementation

{ TBirne }

procedure TBirne.Test;
begin

end;

{ TApfel }

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

{ TBirne }

procedure TBirne.Test;
begin

end;

{ TApfel }

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

user profile iconjaenicke 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! :)