list oder vector oder array oder ???



  • Hängt es vielleicht mit while(fin) zusammen?



  • Ja, das hängt damit zusammen. Blöderweise wird nämlich das eof-Bit erst mit dem ersten erfolglosen Zugriff gesetzt... und damit erst, wenn versucht wird die Zeile nach der letzten einzulesen. Dann bist Du aber schon in der Schleife 😞



  • O.K., bei Listen ist das ja kein größeres Problem, da kann man ja mit .pop_back(); das letzte Element einfach löschen. Habe auch keine bessere Methode gefunden 🙄
    Gruß
    Yvonne



  • O.K., bei Listen ist das ja kein größeres Problem, da kann man ja mit .pop_back(); das letzte Element einfach löschen. Habe auch keine bessere Methode gefunden 🙄
    Gruß
    Yvonne



  • Yvonne schrieb:

    Habe auch keine bessere Methode gefunden 🙄

    Probier mal

    while(fin>>x>>y)
    {
    ..
    }
    


  • Funktioniert! Super! Danke!
    Welche Klassen würdet Ihr denn für dieses Problem kreiren?
    Eine für die Listen oder/und eine für jedes Paar?
    Habe das noch nicht so ganz verstanden, bin aber noch relativ unerfahren mit OOP. Kenne zwar die Prinzipien, habe aber bisher meist prozedural programmiert.



  • Habe jetzt mal eine Klasse für die Koordinaten gebastelt:

    #include "Koord.h"
    
    Koord::Koord(){}
    Koord::Koord(double x, double y){
    	itsx=x;
    	itsy=y;
    }
    Koord::~Koord(){}
    
    double Koord::getx(){
    	return itsx;
    }
    

    mit den privaten Datenelementen double itsx und double itsy.

    ich versuche nun nach:

    list<Koord> koordList;
    double x,y;
    while(fin>>x>>y){
       double x, y;
       fin >> x >> y;
       koordList.push_back(Koord(x,y));
    }
    fin.close()
    

    mit:

    for(list<Koord>::const_iterator ci = koordList.begin(); ci!=koordList.end(); ++ci)
    cout <<*ci << "\n";
    

    ich dereferenziere also den Iterator-Zeiger und erhalte dann was??? Wie komme ich an die Inhalte meiner Objekte? **ci geht nicht und *ci->getx() auch nicht 😞
    Bin etwas ratlos
    ???
    :xmas1:



  • Also ich habe es folgendermaßen gelöst:

    for(list<Koord>::const_iterator ci = koordList.begin(); ci!=koordList.end(); ++ci){
       const Koord& test = *ci;
       cout << test.itsx << "\n";
    }
    

    Damit das funktioniert mußte ich meine Datenelemente public setzten, was ich eigentlich nicht wirklich will 😞
    Aber mit

    cout << test.getx() << "\n";
    

    bekomme ich folgenden Fehler:
    error C2662: 'Koord::getx': this-Zeiger kann nicht von 'const Koord' in 'Koord &' konvertiert werden 😮

    Kann mir das jemand erklären???
    Grüße
    Yvonne



  • Zugriff über den iterator geht mit it->getx();

    Was Dich da später ereilt ist const-correctness. Du legst ne const-Referenz auf das Objekt an. Das ist gut. Dann rufst Du getx auf, aber der Compiler weiß nicht, daß die Funktion das Objekt nicht verändern wird und verbietet Dir das daher. Du mußt dem Compiler noch mitteilen, daß Dein get const ist, also das Objekt nicht verändert:

    class Koord
    {
      // ...
      double getX() const;
      // ...
    };
    
    double Koord::getX() const
    {
      return x;
    }
    


  • Danke!
    Darauf wäre ich wohl so schnell nicht selber gekommen 😉

    Grüße
    Yvonne

    P.S.: gibt es noch Vorschläge bezüglich weiterer Klassen?


Anmelden zum Antworten