eigener dateentyp



  • Lies dir das mal durch:
    http://www.willemer.de/informatik/cpp/cppovrld.htm

    So halt...

    BigNum operator+(const BigNum &rhs) 
    { 
        //pseudocode
    	BigNum temp = *this;
    
        for(vector<unsigned long>::const_iterator i = rhs.ziffern.begin(); i != rhs.ziffern.end(); ++i) 
        { 
            //korrekte mathematische Operation angeben (hier nur Beispiel) 
            temp.ziffern.push_back(*i); 
        } 
    
        return temp; 
    }
    


  • HighLigerBimbam, da ist ja einiges böses am Werk...

    1. obwohl du lhs NICHT veränderst gibst du eine nicht-konstante Referenz als Parameter mit
    2. "lhs" ist Irreführend, da "this" darauf hindeutet, dass du in einer Memberfunktion bist und da eben "this" der lhs ist
    3. Du gibst *this als value zurück, was direkt auf 4) zurückzufhühren ist
    4. gaaanz böse: dein operator+ verändert this! Das ist ein nicht erwarteter und auch unsinniger Nebeneffekt.
    c = a+b; // und a hat einen anderen Wert!! Ouch!
    

    Wenn du Tips an einen Unerfahrenen gibst, sollten die auch bitte korrekt sein...



  • Schön das wenigstens einer aufpasst.



  • kann mir jemand sagen, was genau hier passiert:

    temp.ziffern.push_back(*i);
    

    ich hatte noch nie was mit so was zutun



  • i ist in dem Fall ein iterator, der auf den Ort zeigt, wo sich der Wert befindet.
    Um an den eigentlichen Wert zu kommen, verwendet man den Dereferenzierungsoperator *
    mit push_back wird der Wert einem Container (in dem Fall vector) hinzugefügt. Also an das Ende angehängt.



  • ich meine eigentlich temp.ziffern und es wird doch dann kein neuer wert übergeben so wie ich das verstehe



  • Meine schöne kostbare Zeit, die gerade im Nirvana verschwindet 🤡

    "ziffern" ist eine Instanz eines vectors, welche im public-Bereich der Klasse BigNum liegt. Auf öffentliche Variablen kann man direkt mittels "." zugreifen.
    temp ist eine Instanz der Klasse BigNum. da ziffern wie gesagt öffentlich ist, kann man mit temp.ziffern auf dieses Objekt zugreifen.



  • ich bekomme es nicht auf die reihe
    ich müsste doch von hinten durch beide vectoren gehen die addieren will und dies dann so machen wie als wenn man schriftlich addiert.

    wenn dies so gehen sollte versteh ich den ansatz von HighLigerBiMBam nicht 😞



  • Gucky schrieb:

    ich bekomme es nicht auf die reihe
    ich müsste doch von hinten durch beide vectoren gehen die addieren will und dies dann so machen wie als wenn man schriftlich addiert.

    wenn dies so gehen sollte versteh ich den ansatz von HighLigerBiMBam nicht 😞

    Das mit push_back war auch nur ein Beispiel, wie man einen Operator überlädt. Du musst natürlich noch die Konkrete Berechnung selbst schreiben.



  • so, ich hoffe, dass man das so machen kann 🙂

    BigNum operator+(BigNum const& rhs)
    	{
    		BigNum temp = *this;
    		short int v = 0;
    		vector<unsigned long>::const_iterator j = temp.ziffern.end()-1;
    		for(vector<unsigned long>::const_iterator i = rhs.ziffern.end()-1; i != rhs.ziffern.begin(); --i) // Bei der schrifltichen addition geht amn immer von rechts nach links
    		{
    			if (*i + *j + v >= 10)
    			{
    			temp.ziffern.push_back(*i + *j + v - 10);
    			v = 1;
    			}
    			else
    			{
    				temp.ziffern.push_back(*i + *j - 10);
    				v = 0;
    			}
    			++j;
    
    		}
    		reverse(temp.ziffern.begin(), temp.ziffern.end()); // Ziffern werden in die richtige reihenvolge gebracht
    		return temp;
    	}
    


  • Gucky schrieb:

    so, ich hoffe, dass man das so machen kann 🙂

    BigNum operator+(BigNum const& rhs)
    	{
    		BigNum temp = *this;
    		short int v = 0;
    		vector<unsigned long>::const_iterator j = temp.ziffern.end()-1;
    		for(vector<unsigned long>::const_iterator i = rhs.ziffern.end()-1; i != rhs.ziffern.begin(); --i) // Bei der schrifltichen addition geht amn immer von rechts nach links
    		{
    			if (*i + *j + v >= 10)
    			{
    			temp.ziffern.push_back(*i + *j + v - 10);
    			v = 1;
    			}
    			else
    			{
    				temp.ziffern.push_back(*i + *j - 10);
    				v = 0;
    			}
    			++j;
    			
    		}
    		reverse(temp.ziffern.begin(), temp.ziffern.end()); // Ziffern werden in die richtige reihenvolge gebracht
    		return temp;
    	}
    

    Das tönt gut.
    Aber schau dir mal rbegin und rend an.
    Vielleicht noch besser, Du speicherst immer alle Zahlen "verkehrt herum" (dann brauchste rbedin/rend nur bei der Ausgabe).



  • dabei dreht sich doch aber nicht das push_back um oder??
    und wie ich grad festgestellt habe geht insert auch nicht

    temp.ziffern.insert(1, *i + *j + v - 10);
    

    ich hab noch eine andere frage und zwar wie kann ich in der main funktionen typen deklarieren?
    wie man es mit einen typ wie int macht würde es so gehen:

    BigNum v1;
    v1.zahl = 10000000000;
    

    so geht es aber nicht.
    muss ich es vielleicht mit der set methode machen??



  • mir ist grad eingefallen ich machs am besten mit nem überladenen = operator wenn das geht


Anmelden zum Antworten