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äre

    vector<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äre

    vector<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 streams 🙄

    Uhm ... Das ist'n Argument 🤡


Anmelden zum Antworten