Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OOP: Bidirektionale Beziehung zw. Klassen [erledigt] (https://www.delphipraxis.net/67551-oop-bidirektionale-beziehung-zw-klassen-%5Berledigt%5D.html)

Passi077 16. Apr 2006 16:20


OOP: Bidirektionale Beziehung zw. Klassen [erledigt]
 
Hi,

ich bin gerade dabei eine PartikelEngine zu programmieren. Das Ganze soll objektorientiert geschehen.

Dazu habe ich 2 Klassen erstellt: cParticleEffekt und cParticle:

Delphi-Quellcode:
type cParticle=class
   private
     thePosX, thePosY: real;

     procedure setVelocity(pVelocity: Velocity3f);
     procedure Kill();
end;

type cParticleEffekt=class
  private
    theMaxParticleCount: integer;
    theTime: real;

    particle: array of cParticle;

  public
    procedure Calculate(t: real);
    procedure addParticle(pIndex, pPreset: integer);

    constructor create(pMaxParticles: integer);

  end;
Nun muss ich zwischen diesen beiden Klassen eine bidirektionale Beziehung aufbauen, damit

a) die Klasse cParticleEffekt auf die einzelnen Partikel zugreifen kann und diese berechnen kann
b) die Klasse cParticle Zugriff auf Variablen der Klasse cParticleEffekt hat, welche sich global auf alle Partikel auswirken

Leider bin ich damit überfordert. Ich wollte die Klasse cParticle von der cParticleEffekt Klasse abhängig machen und habe das Ganze so modelliert:

Delphi-Quellcode:
type cParticle=class
   private
     thePosX, thePosY: real;
[b]  ParticleEffekt: cParticleEffekt; [/b]

     procedure setVelocity(pVelocity: Velocity3f);
     procedure Kill();

[b]   constructor create(pParticleEffekt: cParticleEffekt); [/b]
end;

type cParticleEffekt=class
  private
    theMaxParticleCount: integer;
    theTime: real;

  [b] particle: array of cParticle; [/b]

  public
    procedure Calculate(t: real);
    procedure addParticle(pIndex, pPreset: integer);

    constructor create(pMaxParticles: integer);

  end;
Jetzt kennt die Klasse cParticle aber natürlich den Datentyp cParticleEffekt noch nicht.. wenn ich das Ganze umdrehe im Code, dann kennt eben die Klasse cParticleEffekt den DAtentyp cParticle nicht, und das ist mein Problem.

Wie muss ich das korrekt modellieren, damit es realisierbar ist?

Oder: Wie erstelle ich die Signatur einer Klasse? Also sowas in der Art:

Delphi-Quellcode:
type cParticleEffekt=class
end;
Sozusagen eine leere Klasse. Leider kommt dann die Meldung bei der richtigen Klasse, dass der Bezeichner redefiniert wird..

Danke + Grüße
Passi

SirThornberry 16. Apr 2006 16:23

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
einfach eine vorwardeclaration:
Delphi-Quellcode:
type
  cParticleEffekt = class;

  cParticle=class(TObject)
  private
    thePosX, thePosY: real;

    procedure setVelocity(pVelocity: Velocity3f);
    procedure Kill();
  end;

  cParticleEffekt=class(TObject)
  private
    theMaxParticleCount: integer;
    theTime: real;

    particle: array of cParticle;

  public
    procedure Calculate(t: real);
    procedure addParticle(pIndex, pPreset: integer);

    constructor create(pMaxParticles: integer);

  end;

turboPASCAL 16. Apr 2006 16:27

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
@SirThornberry, bitte verwende Delphi-Tags ! :mrgreen:

:wink:

Elvis 16. Apr 2006 16:37

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
Zitat:

Zitat von turboPASCAL
@SirThornberry, bitte verwende Delphi-Tags ! :mrgreen:

Und kein denglish!
Zitat:

vorwardeclaration

Hansa 16. Apr 2006 16:38

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
Wo ist da was mit forward ?? Ich sehe nur eine Klasse, die zweimal deklariert wird. Einmal leer und danach mit Inhalt. Vielleicht liegts aber tatsächlich hier dran :

Zitat:

Zitat von turboPASCAL
@SirThornberry, bitte verwende Delphi-Tags ! :mrgreen:
:wink:

:mrgreen:

Passi077 16. Apr 2006 16:43

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
Hiho,

danke für die Antwort. Leider funktioniert das nicht so wirklich..

Delphi-Quellcode:
type
cParticleEffekt = class;

Spuckt bei mir den Fehler aus:

[Fehler] uParticleEngine.pas(29): Typ 'cParticleEffekt' ist nicht vollständig definiert

:?:


Wie funktioniert das denn genau mit der Forward Deklaration?

Hansa 16. Apr 2006 16:54

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
Das hat der Sir gemeint. 8) Deklarieren, damit der Name bekannt ist, verwendet werden kann und dann weiter unten richtig (komplett) deklarieren.

Hawkeye219 16. Apr 2006 16:57

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
So geht es:

Delphi-Quellcode:
type

  cParticleEffekt = class;
 
  cParticle = class
  private
    thePosX, thePosY: real;
    ParticleEffekt: cParticleEffekt;

    procedure setVelocity(pVelocity: Velocity3f);
    procedure Kill();

    constructor create(pParticleEffekt: cParticleEffekt);
  end;

// type <-- das darf hier nicht stehen

  cParticleEffekt = class
  private
    theMaxParticleCount: integer;
    theTime: real;

    particle: array of cParticle;

  public
    procedure Calculate(t: real);
    procedure addParticle(pIndex, pPreset: integer);

    constructor create(pMaxParticles: integer);

  end;
Innerhalb eines Deklarationsabschnitts müssen alle Typen vollständig definiert sein. Mit der zweiten TYPE-Anweisung wurde der erste Abschnitt beendet und ein zweiter begonnen.

Gruß Hawkeye

Passi077 16. Apr 2006 17:03

Re: OOP: Bidirektionale Beziehung zw. einzelner und Array-Kl
 
Jupp, Dankeschön :) !

SirThornberry 16. Apr 2006 17:53

Re: OOP: Bidirektionale Beziehung zw. Klassen [erledigt]
 
oh man, danke für den Hinweis mit den Delphitags, hab da wohl bissl was verhauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz