![]() |
wechselseitige kennt beziehung (forward deklaration)
hallo bin gerad dabei pacman nachzuprogrammieren hab jedoch nen fehler dirn den ich komischerweise nicht rausbekomme! und zwar gehts darum das ein objekt ein anderes kennen muss und umgekehrt!
ich bekomme immer in der unit upacman den fehler, dass tmonster nicht vollständig definiert ist!!! hier der quellcode für alles
Delphi-Quellcode:
vielleicht erkennt ja einer von euch den fehler!
Hauptunit:
interface uses upacman,umonster; ... pacman:tpacman; monster:tmonster; .... pacman:=tpacman.create(fspielfeld); monster:=tmonster.create(fspielfeld); if monster<>nil then begin pacman.kennt(monster); monster.kennt(pacman); end; if pacman<>nil then begin monster.kennt(pacman); pacman.kennt(monster); end; ... end. Pacmanunit(upacman) type tmonster=class; //HIER TRITT DER FEHLER AUF TPacman=class(TObject) private kmonster:tmonster; ... procedure TPacman.kennt(monster: tmonster); begin kmonster:=monster; end; ... end. Monsterunit(umonster) uses upacman; type tmonster=class(tobject) kpacman:tpacman; ... procedure tmonster.kennt(pacman: tpacman); begin kpacman:=pacman; end; ... end. |
Re: wechselseitige kennt beziehung (forward deklaration)
Solche wechselseitigen Beziehungen sind nur lösbar, wenn du entweder in einer Klasse ein unspezialisierte Instanz hälst (TObject) und in den Implementationen dann immer castest. Andere Möglichkeit wäre es, beide Klassen in einer Unit zu deklarieren, dann würde die Forwarddeklaration auch funktionieren. Diese muss grundsätzlich in der Unit noch aufgelöst werden, wo sie deklariert worden ist (also die Klasse muss darin auch noch definiert werden).
|
Re: wechselseitige kennt beziehung (forward deklaration)
Zitat:
Dein eigentliches Problem liegt schon darin, dass Du eine solche Wechselseitige Abhängigkeit benötigst. Am schönsten lässt sich ein solches Problem immer umgehen, wenn Du eben auf diese Art von Beziehung verzichtest. Die Frage ist, warum muss ein Monster Pacman kennen und umgekehrt? Das ein Monster Pacman kennt ist klar, immerhin sollen die den ja jagen bzw. merken wenn er erwischt wurde. Natürlich kannst Du auch Pacman prüfen lassen, ob er gerade gegen ein Monster gelaufen ist, aber wozu müssen die Beiden sich wechselseitig kennen? Eine gute Alternative ist es dann noch, dass Du mit Interfaces (abstrakte Schnittstellen) oder Vorfahr-Klassen arbeitest. So werden alle Spielfiguren ein paar gemeinsame Eigenschaften haben (z.B. können sie nicht durch Wände laufen, bewegen sich, ...). Das alles kannst Du dann schon in eine gemeinsame Vorfahrklasse packen. Den erbenden Klassen ist dann schon mindestens dieser Vorfahre bekannt. Da Pacman ziemlich einzigartig ist, wird jede andere Instanz dieser Vorfahrklasse natürlich ein Monster sein. Somit kann Pacman schon erkennen, ob es sich bei einem Objekt um ein Monster handelt, ohne dass die Klasse Monster zu dem Zeitpunkt existiert (sauberer wäre aber ein Monster Interface!). Wenn Du dann die Monster erstellst ist Pacman schon fertig und Du kannst die entsprechende fertige Implementierung verwenden (schöner auch hier ein Interface!). Gruß Der Unwissende |
Re: wechselseitige kennt beziehung (forward deklaration)
Hallo danke erstmal an alle helfenden!
@der unwissende: du hattest recht pacman muss garnicht das monster kennen!!!nachdem du mir diesen tipp gegeben hast hab ich mein programm mal schnell umgeschrieben und siehe da ich benötige gar keine wechselseitigen kennt-beziehungen mehr! jetzt kennt nur noch das monster die position von pacman und kann ihn somit auch jagen!!! und das mit den abgeleiteten klassen werd ich auch noch so machen!!! also danke für die schnelle hilfe!!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz