privates vector Element in Klasse schreiben, kleines Problem mit Anfang und Ende des Vectors
-
Hi,
ich möchte eine Kasse in eine Dateischreiben, habe den << operator auch schon überladen nur leider klaptt die Ausgabe des vectors noch nicht ganz. Das Problem der vector ist private, nun habe ich eine Funktion geschrieben die den vector zurückgibt so das ich z.B einen iterator auf den Anfang des vectors setzen kann nur leider werden die Daten nicht in die Datei geschrieben. Wenn ich den vector nun public mache funktioniert es, dass will ich aber logischweise nicht.
class Film { public: // // Konstruktor usw. // // vector<string> getVector(){ return wohnorte; }; //hier die Method die den vector zurückliefert private: string name; vector<string>wohnorte; }; ostream& operator<<(ostream &os,Film &f) { os << f.getName(); // das klappt der Name steht in der Datei vector<string>::iterator it; //iterator for(it = f.getVector().begin();it<f.getVector().end();++it) os << *it << " "; //das klappt nicht er schreibt die Wohnorte nicht in die Datei wie muss ich die Methode getVector modifizien ?? return os; }
So klappt es, der vector ist dann aber public soll aber private sein
ostream& operator<<(ostream &os,Film &f) { os << f.getName(); // das klappt der Name steht in der Datei vector<string>::iterator it; //iterator for(it = f.wohnorte.begin();it<f.wohnorte.end();++it) os << *it << " "; // klappt am Ende steht allles in der Datei return os; }
-
Mach den operator doch einfach als Member deiner Klasse, dann hast du das Problem garnciht.
-
dEUs schrieb:
Mach den operator doch einfach als Member deiner Klasse, dann hast du das Problem garnciht.
meinst du nicht eine friend deklaration? mit friend kann man ja nun auf die privaten elemente zugreifen
-
Ich meine das, was ich schrieb.
-
okay.
mit friend soll man eh vorsichtig umgehen
-
@deus
Wie meinst du das? Wenn man stream<<klasse schreiben will, dann kann der operator<< doch nicht in die eigene Klasse, sondern müsste ins Interface des streams@Chrissie
getVector liefert jedesmal eine Kopie des Vectors. Der Iterator, den getVector().begin() liefert, ist nur gültig, solange der zugehörige vector existiert. Da es sich aber um ein temporäres Objekt handelt, sitzt du auf einem Haufen aus ungültigen Iteratoren.
Besser wärevector<string>& getVector()
oder
const vector<string>& getVector()
Die Iteratoren beziehen sich dann alle auf den Vector in der Klasse und sind die ganze Zeit über gültig.
-
Wie soll man den dann damit im Programm arbeiten wenn der operator << Member ist.
fstream out("Daten.txt",ios::out); Film TestClass("Test"); TestClass << out; //so oder was ??? das kanns doch nicht sein
-
tag schrieb:
@deus
Wie meinst du das? Wenn man stream<<klasse schreiben will, dann kann der operator<< doch nicht in die eigene Klasse, sondern müsste ins Interface des streams@Chrissie
getVector liefert jedesmal eine Kopie des Vectors. Der Iterator, den getVector().begin() liefert, ist nur gültig, solange der zugehörige vector existiert. Da es sich aber um ein temporäres Objekt handelt, sitzt du auf einem Haufen aus ungültigen Iteratoren.
Besser wärevector<string>& getVector()
oder
const vector<string>& getVector()
Die Iteratoren beziehen sich dann alle auf den Vector in der Klasse und sind die ganze Zeit über gültig.
Jo thx so klappt es.
-
tag schrieb:
@deus
Wie meinst du das? Wenn man stream<<klasse schreiben will, dann kann der operator<< doch nicht in die eigene Klasse, sondern müsste ins Interface des streamsUhm ... Das ist'n Argument