ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
572
572
EMPFEHLEN
-
Hallo zusammen,
ich habe folgende Klasse definiert:
Code csharp: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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
namespace MoTD { partial class GameControl { public class Waypoint { private int m_X; private int m_Y; private bool m_Vertical; private int m_Changer = 1; public int X { get { return m_X; } set { m_X = value; } } public int Y { get { return m_Y; } set { m_Y = value; } } public bool Vertical { get { return m_Vertical; } set { m_Vertical = value; } } public int Changer { get { return m_Changer; } set { m_Changer = value; } } } } }
Nun erstelle ich ein Objekt davon:
Code csharp:1 2 3 4 5
Waypoint m_Waypoint = new Waypoint(); m_Waypoint.X = 128; m_Waypoint.Y = 130; m_Waypoint.Vertical = true; m_Waypoint.Changer = 1;
Das will ich jetzt in ein anderes Objekt, auch von der Klasse Waypoint, übertragen:
Dieser Code klappt dabei genau so wenig wer der nachfolgende:Code csharp:1 2 3 4 5
Waypoint PossibleWaypoints = new Waypoint(); PossibleWaypointsY.X = m_Waypoints.X; PossibleWaypointsY.Y = m_Waypoints.Y; PossibleWaypointsY.Vertical = m_Waypoints.Vertical; PossibleWaypointsY.Changer = m_Waypoints.Changer;
Code csharp:1 2
Waypoint PossibleWaypoints = new Waypoint(); PossibleWaypoints = m_Waypoints;
Die Werte die am Anfang in m_Waypoint geschrieben wurden sind noch da, laut Debugger, nur Sie werden einfach nicht in PossibleWaypoints geschrieben. Warum nicht?
Viele Grüße und ich hoffe ihr habt verstanden wie ich das meine,
Eroli
-
04.04.07 00:53 #2
Hallo,
vielleicht ist dir ja der folgende Link hilfreich http://msdn2.microsoft.com/de-de/lib...16(VS.80).aspx.
Gruß
KonstantinInternetseite:
http://www.texturenland.de
Blog:
http://blog.texturenland.de
Codesnippets:
.NET-Snippets
- Sollte ich bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen -
-
Keine schöne Lösung. Implementiere das ICloneable-Interface.
-
Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
Weil dadurch auf den ersten Blick nicht ersichtlich ist, dass das Objekt kopiert wird. Es könnte was weiß ich damit anstellen (zu Vergleichszwecken etc.)
Durch die Implementierung des IClonable-Interfaces erhält das Objekt eine Methode Clone, welche zum Kopieren verwendet wird. Dadurch ist dies auf den ersten Blick für den Entwickler ersichtlich.
Weitere Möglichkeit: MemberwiseClone.
-
04.04.07 11:07 #6
Hallo Norbert,
danke, daran hab ich jetzt nicht irgendwie nicht gedacht, das ist natürlich die schönere Variante. Nun kennt Eroli halt zwei Methoden wie er das bewerkstelligen kann
Gruß
KonstantinInternetseite:
http://www.texturenland.de
Blog:
http://blog.texturenland.de
Codesnippets:
.NET-Snippets
- Sollte ich bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen -
-
Hallo und danke erstmal für die Antworten.
Das mit dem Kopierinterface habe ich verstanden, das mit dem ICloneable hingegen nicht.
Kann mir das vielleicht einer erklären?
EDIT: Und waurm klappt mein Weg eigentlich nicht?
-
Warum hat es nicht funktioniert?
Bei diesem Code
definierst du PossibleWaypoints, schreibst die Daten aber in ein Objekt namens PossibleWaypointsY. Kann also nicht funktionieren.Code csharp:1 2 3 4 5 6
# Waypoint PossibleWaypoints = new Waypoint(); PossibleWaypointsY.X = m_Waypoints.X; PossibleWaypointsY.Y = m_Waypoints.Y; PossibleWaypointsY.Vertical = m_Waypoints.Vertical; PossibleWaypointsY.Changer = m_Waypoints.Changer
Bei der Variante
kopierst du nur die Referenz. Nicht aber das Objekt selbst.Code csharp:1 2
Waypoint PossibleWaypoints = new Waypoint(); PossibleWaypoints = m_Waypoints;
Wie funktioniert ICloneable?
Hier eine Beispiel-Klasse, welche das ICloneable-Interface implementiert:
Code csharp: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
public class Driver : ICloneable { private string _firstname = null; private string _lastname = null; public string Firstname { get { return this._firstname; } set { this._firstname = value; } } public string Lastname { get { return this._lastname; } set { this._lastname = value; } } #region ICloneable Members public object Clone() { Driver d = new Driver(); d.Firstname = this._firstname; d.Lastname = this._lastname; return d; } #endregion }
So, und jetzt der Test:
Hier ist auf den ersten Blick ersichtlich, dass es sich um eine Kopie handelt (durch das Clone. Weiters kannst du durch die Ausgabe der Hashcodes sehen, dass es sich um unterschiedliche Objekte handelt.Code csharp:1 2 3 4 5 6 7 8
Driver d = new Driver(); d.Firstname = "Norbert"; d.Lastname = "Eder"; Driver d2 = (Driver)d.Clone(); Debug.WriteLine(d.GetHashCode()); Debug.WriteLine(d2.GetHashCode());
-
Danke, so t es jetzt endlich.
Weiter so, ihr seid klasse
-
Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
Gehen wir davon aus, dass du diesen Aufruf das erste Mal siehst (b ist hier ein Objekt vom Typ Bimbo und mit relevanten Daten gefüllt):
So, und jetzt sag mir (ohne zu wissen wie der Konstruktor implementiert ist), woran du erkennen willst, dass es sich um einen Copy-Constructor handelt? Der zweite Aufruf zeigt sofort, dass eine Kopie erstellt wird.Code csharp:1 2
Bimbo b2 = new Bimbo(b); Bimbo b2 = b.Clone();
Und wenn du sagst, dass du im Clone genauso einen Vergleich implementieren kannst, dann ist das prinzipiell richtig, dann hast du als Entwickler der Klasse aber gewaltig danebengegriffen. Warum?
Die Methode Clone stammt vom ICloneable-Interface und ist für Kopien (die MSDN läßt sich da nicht so besonders zum Thema Shallow bzw. Deep Copies aus) gedacht. Für Vergleiche wäre Das Interface IComarable zu verwenden, wodurch die Methode CompareTo zu implementieren wäre.
-
Hallo nochmal.
Irgendwie klappt da nochwas nicht so wie es soll.
Wieso klappt der Ausdruck nicht? Braucht ihr noch mehr Infos?Code csharp:1
m_Creep[j].NextWaypoint = (Waypoint)m_Creep[j].PossibleWaypointsY[indexY].Clone();
m_Creep ist ein Array einer Klasse. Diese Klasse hat eine Variable NextWaypoint auch von einer eigenen Klasse Waypoint her.
Nun will ich den Wert aus dem PossibleWaypoints-Array beim Index IndexY in NextWaypoint schreiben. Die Clone Methode sieht so aus:
Code csharp:1 2 3 4 5 6 7 8 9
public object Clone() { Waypoint clonedWaypoint = new Waypoint(); clonedWaypoint.X = this.X; clonedWaypoint.Y = this.Y; clonedWaypoint.Vertical = this.Vertical; clonedWaypoint.Changer = this.Changer; return clonedWaypoint; }
Ich bin so langsam echt am verzweifeln....
Viele Grüße,
Eroli
EDIT: KOmmando zurück - Ich habe nen Bug gefunden. Der Indexer ist immer um 1 zu hoch...sowas ist ja sowas von ärgerlich
Geändert von Eroli (05.04.07 um 23:14 Uhr)
Ähnliche Themen
-
Werte aus einem Objekt teilen?
Von fUnKuCh3n im Forum PHPAntworten: 2Letzter Beitrag: 04.05.10, 14:20 -
Werte von einem Bean an ein anderes übergeben [JSF]
Von Bexx im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 13.01.10, 09:39 -
Komplettes Bitmap von einem CBitmap-Objekt in Anderes kopieren
Von Meisterzunge im Forum VisualStudio & MFCAntworten: 6Letzter Beitrag: 10.01.07, 17:48 -
Objekt soll ein anderes Objekt sichtbar machen
Von T4B im Forum Cinema 4DAntworten: 8Letzter Beitrag: 29.09.06, 10:53 -
Kann man ein Objekt durch Projizieren auf ein anderes Objekt ausrichten?
Von katha1001 im Forum Cinema 4DAntworten: 7Letzter Beitrag: 08.06.05, 14:16





Zitieren


Login





