Referenz mit einer anderen Referenz überschreiben

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benu
Beiträge: 2
Registriert: Do 21. Jul 2016, 12:25

Referenz mit einer anderen Referenz überschreiben

Beitrag von Benu »

Zunächst einmal ich bin ein absoluter Neuling sowohl im Forum als auch in Lazarus, also entschuldige ich mich schon mal für etwaige Fehler und meinen grausigen Code. :oops:
Vorneweg ich rechne damit, dass ich...
a)...die Sache verkompliziere :oops:
b)...die Lösung in meiner Unfähigkeit einfach übersehen habe.
Dafür möchte ich mich dann auch entschuldigen :oops:
Also zu meinem Problem oder besser gesagt zur Ausgangssituation:
Ich habe zwei Klassen, die noch fast nichts beinhalten(wird auch nicht viel, da es mein ersten richtiges Programm mit Lazarus ist :oops: ):
unit uspieler;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils;
type
TSpieler=class
private
FGeneral:String;
public
constructor create(general:String);
property General:String read FGeneral;
end;
unit land;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, uspieler;
type
TLand=class
private
FName:String;
FEinheiten:Integer;
FBesatzer:TSpieler;
public
constructor create(name: String);

property Name:String read FName;

property Einheiten:Integer read FEinheiten write FEinheiten;
property Besatzer:TSpieler read FBesatzer write FBesatzer;
end;
Nun wie man sehen kann steht das ganze noch am Anfang. Folgendes Problem ergibt sich dann aber bei der Verwendung:
In einer anderen Klasse wird mit zwei Instanzen von TLand(Angreifer,Verteidiger) gearbeitet, die jeweils eine Referenz auf eine andere Instanz von TSpieler(haben keine Namen, kommen aus einem Array) enthalten. Problem ist, dass ich nun die Referenz der ersten Instanz von TLand(Verteidiger) mit der von Angreifer überschreiben.
Verteidiger.Besatzer:=Angreifer.Besatzer;
Würde nun eine Referenz herstellen, somit wären die FBesatzer von beiden Instanzen immer gleich, das darf es aber nicht sein, da Angreifer und Verteidiger per Nutzereingabe aus einem Array of TLand (enthält im Moment nur 2Elemente, damit ich es einfacher testen kann) ausgewählt werden und dann somit ständig irgendwelche falschen FBesatzer geändert werden würden. Ich brauche daher einen Weg um die Referenz von Verteidiger mit der Referenz von Angreifer zu überschreiben.
Als eine Alternative hätte ich die Idee, dass TLand statt einer Referenz einen String bekommt, mit dem die richtige Instanz von TSpieler aus einem Array identifiziert werden kann, aber da weiß ich nicht, ob das nicht vielleicht zu kompliziert wird, da sich damit mindestens eine Prozedur befassen muss.
Sollte meine Frage totaler Blödsinn sein, tut es mir natürlich Leid :oops:
PS: Ich habe die verarbeitende Klasse extra nicht eingefügt, da ich an dieser gerade arbeite und daher ein solches Chaos herrscht, dass ich hier niemandem zumuten möchte :oops:
Sorry!

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Referenz mit einer anderen Referenz überschreiben

Beitrag von Michl »

Ich habe zwar nur die Hälfte verstanden, aber wenn du nicht eine Instanz mit einer anderen ersetzen willst, so musst du den Inhalt und nicht die Instanz selber kopieren. Zum Beispiel kann man eine Methode "Assign" in die Klasse einbauen und dort die notwendigen Kopieranweisungen vornehmen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benu
Beiträge: 2
Registriert: Do 21. Jul 2016, 12:25

Re: Referenz mit einer anderen Referenz überschreiben

Beitrag von Benu »

Danke, dass du mir helfen willst.
Mein chaotischer erster Beitrag tut mir Leid. Ich wollte, dass die Länder(TLand) den sie besitzenden Spieler(TSpieler) identifizieren können und umgekehrt.
Das habe ich dann versucht zu erreichen, indem ich jedem Land eine Referenz auf den Spieler mitgebe, das Problem ergibt sich dann, wenn ein Spieler ein anderes Land erobert und es in seinen Besitz übergeht.
Unglücklicherweise ist mir soeben klar geworden, dass ich das Problem umgehen kann, indem ich die Spieler als Array global deklariere und über die Indizes die Spieler eindeutig identifiziere, was eine Methode in TLand übernehmen wird, so muss ich dann nur den Index, also einen Integer überschreiben(Hab irgendwie übersehen, dass das in Lazarus so einfach funktioniert.). :oops:
Da hatte ich mich in dem falschen Ansatz verrannt. :oops:
Das ganze(insbesondere meine eigene Dummheit) tut mir wirklich Leid :cry:
Sorry!

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Referenz mit einer anderen Referenz überschreiben

Beitrag von Michl »

Hey, du brauchst dich doch nicht zu entschuldigen. Für Fragen ist ein Forum da. Nur, manchmal ist halt weniger mehr. Also Kopf hoch, freue dich, dass du eine Lösung gefunden hast. Und überhaupt erstmal willkommen hier im Forum und bei Lazarus!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten