AnsiString und std::vector
-
hola leute
hab hier ne klasse Daten:
class Daten { public: int x; int y; AnsiString str; };bei folgender anwendung ist der AnsiString danach ploetzlich wieder leer.
Daten d; d.x = 1; d.y = 2; d.str = "test"; std::vector<Daten> d_vec; // <- zeig ich nur mal hier. ist aber nich auto d_vec.push_back(d); ... // danach irgendwo anders im prgramm ShowMessage(d_vec.back().str); // hier wird dann ne leere MessageBox angezeigtwarum ist das so ?
Meep Meep
-
Hallo,
Veränderst du den d irgendwo dazwischen?
Es könnte daran liegen, dass AnsiString intern mit Referenzzählung arbeitet. Was bedeutet, dass bei Kopieen evtl. nur ein interner Zeiger rübergereicht wird. Dann würdest du bei Veränderung der Kopie auch das Orginal ändern. Das ist mir zwar noch nicht passiert, aber immerhin möglich. Schau mal in die Hilfe nach AnsiString::Unique
-
hola Braunstein
ha jetzt mal zum testen den AnsiString gegen einen std::string ausgetauscht.
noch immer das gleiche problem. scheinbar doch nicht durch den AnsiString verursacht.// die Streamfunktion fuer meinen klassenvector TStream& operator>>(TStream &s, ArtikelList &al) { unsigned int size(0); s >> size; ArtikelData data; while(size--) { s >> data; //ShowMessage(data.Text().c_str()); // testausgabe al.push_back(); al.back() = data; //ShowMessage(al.back().Text().c_str()); // testausgabe } return s; } ... try { TFileStream *datei = new TFileStream("data.dat", fmOpenRead); *datei >> private_db; delete datei; ShowMessage(private_db[0].Text().c_str()); // hier kommt nuex }so sieht der code aus. bei der testausgabe bekomme ich von anfang an noch die strings angezeigt. im try-block dann bekomme ich in der MessageBox nix mehr.
wenn ich mir dann spaeter im programm ne tabelle mit den variablen antzeigen lasse, dann sind die ersten 64 strings leer und die restlichen 38 sind da.
in der datei stimmt auch alles.Meep Meep
-
Was genau soll das denn sein?
al.push_back(); al.back() = data;Das sollte eigentlich gar nicht compilieren. push_back verlangt einen Parameter.
Wieso schreibst du stream-Operatoren für TStream? Die haben doch normalerweise keine. Wo kommt der operator >> für ArtikelData her?
Mach bitte das ganze mal entweder mit Standardstreams oder nutze read und write von TStream.
-
re
Braunstein schrieb:
Was genau soll das denn sein?
al.push_back(); al.back() = data;Das sollte eigentlich gar nicht compilieren. push_back verlangt einen Parameter.
Wieso schreibst du stream-Operatoren für TStream? Die haben doch normalerweise keine. Wo kommt der operator >> für ArtikelData her?
Mach bitte das ganze mal entweder mit Standardstreams oder nutze read und write von TStream.das mit al.back() = data; war nur mal so ein test.
mit
s >> data; al.push_back(data);komm ich auf das gleiche ergebnis.
die operatoren << und >> hab ich fuer mich selber geschrieben.
da drinnen wird dann natuerlich Read und Write verwendet.
an den ueberladenen operatoren kanns ja nicht liegen, weil ich bei den testausgaben den string noch zu sehen bekomme. aber irgendwie verschwinden sie dann.Meep Meep
-
Ich habe nur den Verdacht, dass es genau an diesen Operatoren liegt, da dein Stringinhalt ja nach dem Löschen des Stream verschwindet.