Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - [OOP] Klassen verknüpfen -- Problem (Entwicklung v. Graph)


PrismaX - So 09.10.11 19:51
Titel: [OOP] Klassen verknüpfen -- Problem (Entwicklung v. Graph)
Hallo,

ich möchte einen Graph (Datenstruktur) mit Hilfe von Pointern und OOP realisieren.

Ich habe auch schon eine wage Vorstellung wie die einzelnen Klassen des Graphs aussehen sollten (d.h. TKnoten, TKante etc), allerdings stehe ich vor einem Problem nämlich wie ich die Verbindungen der Klassen untereinander programmiere (noch nicht so viel gearbeitet mit OOP).

UML-Diagramm im Anhang

Danke im Vorraus

Moderiert von user profile iconNarses: BMP->PNG
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 10.10.2011 um 10:40


Xion - Mo 10.10.11 07:03

Dein Vorgehen ist etwas ungewöhnlich in meinen Augen.

Ich würde so vorgehen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Graph: 
  - array of TKnoten; //alle Knoten des Graphen

  TKnoten:
     - array of TKante  //alle Kanten, die von diesem Knoten wegführen

     TKante:
        - Nach: TKnoten //Ziel der Kante
       (- Von : TKnoten //Start ist der Knoten, zu dessen Array diese Kante gehört )


Das ganze heißt Adjazenzlistendarstellung. Viele Wegfindungsalgorithmen eignen sich für diese Darstellung (z.B. Dijkstra)


PrismaX - Mo 10.10.11 12:01

Hmmm... Also die Erstellung eines Graphen über ne Adjazenzmatrix habe ich ja schon programmiert. Mir ginge es eher darum ob es möglich ist das Ganze Objektorientiert und dynamisch zu programmieren.

Dabei habe ich mir eben diese Klassen ausgedacht nur überschneiden sich ja die Aggregation und Assoziation bei TKnoten und TKante (siehe Anhang) und mir fällt nicht ein wie ichs so hinbekomme dass ich trotz dieser beiden Beziehungen die Units funktionsfähig implementieren kann.


Horschdware - Mo 10.10.11 13:09

Dein Problem ist der Kreuzbezug zwischen den Klassen TKnoten und TKante. Gehen wir mal der Einfachheit halber davon aus, dass beide in der gleichen Unit definiert sind, dann gibt folgendes einen Fehler:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  TKnoten = class
    private k : TKante;
  end;

  TKante = class
    private n : TKnoten;
  end;

, da bei Deklaration von TKnoten die benötigte Klasse TKante noch unbekannt ist.

Das lässt sich lösen, wenn man erst einmal eine der beiden Klassen im Vorfeld namentlich bekannt macht und die tatsächliche Deklaration hinten anstellt. Siehe:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  TKante = class;

  TKnoten = class
    private k : TKante;
  end;

  TKante = class
    private n : TKnoten;
  end;


PrismaX - Mo 10.10.11 15:02

Vielen Dank!

Ich werd die jetzt wahrscheinlich nicht in zwei Units realisieren aber ersteinmal hilft mir das gut weiter.

Wer noch eine Lösung für zwei Units hat kann sie gerne schreiben ;), ist aber nicht mehr so wichtig.

LG PrismaX