List Iterator kann nicht dekrementiert werden?



  • Hallo,

    ich übe gerade für die Informatik Klausur und habe das was ich auf dem Blatt theoretisch geschrieben habe (so wie die aufgabe lautete) mal ausprobieren wollen und es kommt immer der fehler "list iterator not decrementable"

    bei folgendem Code (fehler tritt in der Funktion "linieAnfuegen" auf bei der if-abfrage) ich schätze mal end steht ja in einem ungültigem bereich und der iterator kann dann wohl nicht dekrementiert werden um auf das letzte element zuzugreifen? aber wozu hat list dann die funktion back ?

    #include <iostream>
    using namespace std;
    #include <string>
    #include <list>
    
    class Punkt { 
    double x,y; 
    
    public:
    Punkt(double x, double y);
    double getX() const;
    double getY() const;
    bool operator!=(const Punkt& p);
    
    }; 
    
    class Linie {
    Punkt anfang, ende;
    
    public:
    Linie(Punkt a, Punkt e);
    Punkt getEnde() const;
    double getLaenge() const;
    
    }; 
    
    class Linienzug { 
    list<Linie> linien; 
    
    public:
    Linienzug();
    void linieAnfuegen(Punkt& a, Punkt& e);
    double getGesamtLaenge() const;
    
    }; 
    bool Punkt::operator!=(const Punkt& p){
    	if((this->getX() != p.getX()) || (this->getY() != p.getY())){
    		return false;
    	}else{
    		return true;
    	}
    }
    double Linie::getLaenge() const{ return 1;}
    double Punkt::getX() const{ return this->getX(); }
    double Punkt::getY() const{ return this->getY(); }
    Punkt::Punkt(double x, double y){this->x=x; this->y=y;}
    Linie::Linie(Punkt a, Punkt e):anfang(a),ende(e){}
    Linienzug::Linienzug(){}
    Punkt Linie::getEnde() const{ return this->ende; }
    void Linienzug::linieAnfuegen(Punkt &a, Punkt & e){
    
    	if(a!= linien.back().getEnde()) throw string("Endpunkt ungleich Anfangspunkt");
    	Linie l(a,e);
    	linien.push_back(l);
    }
    
    double Linienzug::getGesamtLaenge() const{
    	double laenge=0.0;
    	list<Linie>::const_iterator it;
    	for(it=linien.begin(); it!=linien.end(); it++){
    		laenge+= it->getLaenge();
    	}
    	return laenge;
    }
    
    int main (void) { 
    
     Linienzug lzug; 
     try{
     lzug.linieAnfuegen(Punkt(0,0), Punkt(3,0)); 
     lzug.linieAnfuegen(Punkt(3,0), Punkt(3,4)); 
     cout << lzug.getGesamtLaenge() << endl; 
    
     }
     catch(string & e){
    	 cout << e;
     }
     catch(...){
    	 cout << "Es trat ein Fehler auf";
     }
    
     return 0; 
    };
    


  • Als du das erste mal Linienzug::linieAnfuegen () aufrufst, hat der Container doch noch gar keine Elemente:

    void Linienzug::linieAnfuegen (Punkt &a, Punkt & e)
    {
        list<Linie>::iterator end = linien.end ();
        if (end != linien.begin () && *--end != linien.back().getEnde())
            throw string ("Endpunkt ungleich Anfangspunkt");
        linien.push_back (Linie (a,e));
    }
    


  • mhhm so kommen bei mir viele fehlermeldungen (template argumente konnten nicht hergleitet werden oder sowas) ,ich verstehe die abfrage auch nicht ganz

    also in den objekten von linie sind 2 objekte von der klasse punkt und die funktion soll prüfen ob der anfang vom neu angegebenen punkt gleich dem ende des letzten linienelementes und davon der endpunkt ist , ich hoffe man kann mein text verstehen 😃



  • Klar, das hab ich verstanden. Aber wenn du das erste mal in Zeile 70 lzug.linieAnfuegen(Punkt(0,0), Punkt(3,0)); aufrufst, versucht diese Funktion linien.back() aufzurufen (Zeile 52). Zu diesem Zeitpunkt enthält der Container aber noch keine Elemente. D. h. back () schlägt Fehl, weil er versucht das letzte Element zu bekommen, welches es aber noch nicht gibt. Schau dir einfach mal die Definition von back () an:

    reference
    back()
    { 
    	iterator __tmp = end();
    	--__tmp;
    	return *__tmp;
    }
    


  • ok das stimmt aber wenn ich jetzt das mit abfragen sauber prüfe bringt der kein fehler mehr aber fügt iergendwie nichts ein 😕 (also bei der summenbildung bei der schleife mit dem iterator it wird bei cout nichts ausgegben bzw. hochgezählt)

    void Linienzug::linieAnfuegen(Punkt &a, Punkt & e){
    
        list<Linie>::iterator end = linien.end (); 
    	if (end==linien.begin()) {
    		linien.push_back (Linie(a,e));
    	}else{
    		if(linien.back().getEnde() != a){
    			throw string ("Endpunkt ungleich Anfangspunkt\n");
    		}else{
    			linien.push_back (Linie(a,e));
    		}
    	}
    
    }
    


  • ok die probleme wurden von nem anderen forenmitglied behoben, war ein logischer fehler , eine rekursion in den getX , getY funktionen und falsche abfrage


Anmelden zum Antworten