Autor Beitrag
|\/|_/\_><
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 19.04.05 10:13 
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


Zuletzt bearbeitet von |\/|_/\_>< am Di 19.04.05 12:16, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 19.04.05 10:42 
Ich nehme mal an, dass du mit interface den entsprechenden Teil einer Delphi-Unit meinst.
Beispiel:
ausblenden volle Höhe 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...)


Zuletzt bearbeitet von jaenicke am Di 19.04.05 13:13, insgesamt 2-mal bearbeitet
|\/|_/\_>< Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 19.04.05 11:30 
danke schonmal,
aber irgendwie bekomme ich gleich in der zweiten Zeile eine Fehlermeldung:

ausblenden Delphi-Quelltext
1:
2:
interface
  TApfel = class;


Deklaration erwartet, aber Bezeichner 'TApfel' gefunden.
|\/|_/\_>< Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 19.04.05 12:20 
Außerdem habe ich in meinem Code kleine Unterschiede - kann das damit zusammenhängen?

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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

ausblenden 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

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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"

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|\/|_/\_>< Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 19.04.05 13:21 
danke - so geht's jetzt! :)