Heim >Backend-Entwicklung >C++ >Warum überschreibt das Hinzufügen eines neuen Werts zu einer Liste vorherige Werte, wenn Referenztypen verwendet werden?
Liste verstehen
Der bereitgestellte Code zeigt eine häufige Gefahr bei der Verwendung von Referenztypen mit Listen. Da die Klasse Tag
ein Referenztyp ist, bedeutet dies, dass Variablen eine Referenz auf den Speicherort des Objekts enthalten und keine Kopie des Objekts selbst.
Innerhalb der Schleife wird dieselbe _tag
Instanz wiederholt geändert. Durch jede Hinzufügung zur Liste wird kein neues Tag
-Objekt erstellt. Stattdessen wird ein weiterer Verweis auf das gleiche _tag
-Objekt hinzugefügt. Daher enthält die endgültige Liste mehrere Verweise, die auf den letzten geänderten Status von _tag
.
Warum die Verwendung von struct
das Problem löst
Das Ändern von public class Tag
in public struct Tag
behebt das Problem, da Strukturen Werttypen sind. Wenn eine Struktur zugewiesen wird, wird eine Kopie der Daten der Struktur erstellt. Folglich erstellt jede Iteration der Schleife eine völlig unabhängige _tag
-Instanz. Änderungen an einer Instanz wirken sich nicht auf andere aus, sodass eine Liste mit eindeutigen Tag
-Objekten entsteht.
Abgeleitete Sammlungsklassenrelevanz
Das Problem liegt nicht im Design der Klasse TagCollection
. Die Klasse TagCollection
selbst scheint korrekt implementiert zu sein. Das Kernproblem liegt darin, wie die _tag
-Instanz innerhalb der Schleife behandelt wird, die die Liste füllt, insbesondere die wiederholte Änderung einer einzelnen Referenztypinstanz.
Das obige ist der detaillierte Inhalt vonWarum überschreibt das Hinzufügen eines neuen Werts zu einer Liste vorherige Werte, wenn Referenztypen verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!