stringstream in struct ??
-
Hallo Leute ich habe irgendwie das Problem, dass wenn ich in eine struct einen stringstream als member habe, den folgenden Fehler bekomme:std::basic_ios<_Elem,_Traits>::basic_ios": Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios<_Elem,_Traits>-Klasse erfolgte
Ich habe das schon gegoogelt und da stand, dass passiert wenn man z.B ein stringstream als Rückgabewert einer Funktion hat ( da müsste man es mit einer referenz machen).
Aber hier weiß ich auch nicht.
So siehts aus:
struct IProfile { IProfile() : playername(""), progress(""){ } std::string playername; std::stringstream progress; };
-
Ein stringstream Member? WTF?
-
Warum ??
Ich würde das Teil gerne für serialisierubng benutzen mit boost.
Diese stuktur soll erst geladen werden aus einer Datei und dann soll mit boost::archive::text_iarchive a(stringstream name)... das ganze mit diesem Archiv entserialisiert werden.
-
Der unmittelbare Fehler ist, dass Streams nicht kopierbar sind. Irgendwo machst du, möglicherweise implizit, eine Kopie des Members oder ganzen Objekts. Das geht dann natürlich nicht.
Kellerautomat schrieb:
Ein stringstream Member? WTF?
+1. Wozu soll das gut sein?
-
Ich weiß nicht ohne stringstream funktioniert alles einwandfrei, nur wenn ich in die struct den einfüge gehts nichtz mehr ( ich mach niergendwo noch irgendwas )
Ja wie gesagt, ich bin mir eigendlich auch nicht so sicher ob das so toll sein soll.
Die Idee war eigendlich, dass man einen Profilmamnager hat, der Profile ( in einem Spiel ) speichert.Dieses Profil besteht noch aus name und das zweite sollte der Fortschritt sein. Bei dem Fortschritt werden einfach alle klassen, die einfluss auf den Fortschritt haben, bzw. dsas ganze speichern serialisiert und als stream gespeichert.
Ich brauche jedoch auf jedenfall einen stream zum serialisieren, fstream oder eben stringstream, da wäre ein stringstream natürlich besser,
-
Bob Wolfskin schrieb:
Ich weiß nicht ohne stringstream funktioniert alles einwandfrei, nur wenn ich in die struct den einfüge gehts nichtz mehr ( ich mach niergendwo noch irgendwas )
Lies nochmal SeppJs Antwort.
Bob Wolfskin schrieb:
Ich brauche jedoch auf jedenfall einen stream zum serialisieren, fstream oder eben stringstream, da wäre ein stringstream natürlich besser,
Warum muss das ein Member der Klasse sein? Du kannst den Stream als lokale Variable in der Serialisierungsfunktion erstellen.
Und wieso sollte
std::stringstreambesser sein alsstd::fstream? Die beiden haben verschiedene Anwendungsgebiete (Strings und Dateien).
-
Ich habe 2 wege:
Ich erstelle in der sturctur das stringstream indem die serialisieren klassen gespeichert sind ( d.h auch als member ) und speichere es direkt.Oder ich erstelle einfach mit fstream eine zweite Datei, wo ich dann eben das ganze serialisierte habe.
-
Ich verstehe nicht, was du damit erreichen willst. Wenn du die Daten serialisieren willst, dann nützt es auch nichts, wenn jede Instanz in einen eigenen Stream schreibt.
Ich denke für deine Zwecke eignet sich eher eine Methode, die eine Referenz auf einen stringstream als Parameter hat.
struct IProfile { IProfile() : playername(""), progress(""){ } std::string playername; void serialize(std::stringstream& stream) { stream<<playername; // oder was du hier auch immer machen willst } void deserialize(std::stringstream& stream) { stream>>playername; } };