Probleme beim Vergleich von Brüchen (selbstdefinierter Datentyp)



  • Hi,
    wie im Titel schon beschrieben, habe ich ein Problem dabei zwei Brüche miteinander zu vergleichen. Ich studiere Informatik im ersten Semester und in dieser Aufgabe soll erst ein Array erstellt werden welches Daten von Typ Fraction speichert.Dieses Array soll dann um mehrere Memberfunktionen erweitert werden, die unterschiedliche Aufgaben erfüllen. Zum Beispiel soll die Funktion size() die Größe des Arrays zurückgeben.
    Hat man die verschiedenen Memberfunktionen geschrieben soll man eine TestUnit schreiben die die einzelnen Funktionen des Arrays testet.

    Und hier habe ich mein Problem:
    kleine Anmerkung:Ich habe das Klasse ArrayForFraction als Template geschrieben weil man im späteren Verlauf der Aufgabe noch mit anderen Typen arbeiten soll.

    ich möchte die Funktion fill() testen

    /* Fill array with value
    	Sets val as the value for all the elements in the array object.
    	.. Implement with pointer arithmetic
    	*/
    	void fill ( const T& val )
    	{
    		T *Parray = elems;
    		for (int i=0; i<MAX_SIZE; i++)
    		{
    			*Parray = val;   // *Parray++ =val auch möglich
    			Parray++;
    		}
    	}
    

    ich hatte mir erst vorgestellt das dies so möglich ist:

    void TestArrayForFraction::test_fill()
    	{
    	  ArrayForFraction<Fraction> Fraction_Array;
    	  bool pass = true;
    	  int MAX =128;
    	  Fraction_Array.fill(Fraction()); //Standardkonstruktor zähler=0 nenner=1
    
    		for (int i = 0; i<MAX; i++)
    			if(Fraction_Array[i] != Fraction())
    				pass = false;
    
    		cout<< setw(55)  << "TestArrayForFraction::test_fill" << ( (pass) ? "PASS" : "FAIL" ) << endl;
    
    	}
    

    Jedoch wird der != Operator in der for-Schleife immer mit dem Fehler (Kein != Operator stimmt mit den angegebenen Operanden überein) markiert.

    Hab mir dann überlegt das ich das Array auch einfach mit einem beliebigen Bruch füllen kann, dann mir den Bruch mit Hilfe des Indexes ausgeben lasse und diesen dann mit sich selbst dividiere. Denn wäre es der richtige Bruch mit dem ich das Array befüllt habe würde ja bei der Division immer 1 bzw ein Bruch 1/1 herauskommen. Diese Idee hat aber auch nicht funktioniert.

    Bin mitlerweile am Überlegen ob es am []operator liegt, dass es nicht funktioniert,diesen musste man nämlich auch selbst schreiben. Ich kann mir aber nicht vorstellen was daran falsch sein soll:

    /* Access element
    	Returns a reference to the element at position n in the array container.
    	Implement using pointer arithmetic
    	*/
           T& operator[] ( size_t index ) throw()				
    	{
    		return *(elems+index);      // *(elems+index)
    	}
    

    Ich hoffe ihr versteht mein Problem und hab vielleicht sogar die Lösung.

    MfG,
    sanJo



  • Hast du auch einen bool operator!=(Fraction const &first, Fraction const &second) geschrieben?



  • Du musst den != operator überladen.

    gruß
    syntax



  • ok das hatte ich vorher schon probiert.Ich hätte den Operator so überladen:

    //Fraction.h
    bool operator != (const Fraction & bruch1,const Fraction & bruch2)
    
    //Fraction.cpp
    bool operator != (const Fraction & bruch1,const Fraction & bruch2)
    {
    	return ! (bruch1.n * bruch2.z == bruch2.n * bruch1.z);
    
    }
    

    Das Problem ist nur ,dass in der Headerdatei der Compiler mir operator rot markiert mit der Fehlermeldung "Zu viele Parameter für diesen Operanden" und in der *.cpp beschwert er sich, dass er nicht auf die Variablen n und z zugreifen kann, weil die in der Klasse private sind ( n = nenner ; z=zähler). Das Problem versteh ich jetzt halt nicht weil ich ja den Operator in der Klasse Fraction deklariert habe. Dann sollte das Ding ja auch in der Lage sein auf die als private deklarierten Variablen zuzugreifen?!



  • Mach einen friend bool operator!=, statt ihn als Klassenmember zu deklarieren.



  • Wenn du diese Funktion, so wie du sie uns zeigst, in die Klasse packst, dann hat sie zu viele Parameter, denn als erster Parameter ist der *this-Zeiger.

    in der Klasse:
    
    bool operator != (const Fraction& rhs);  //erster Parameter unsichtbares this
    
    ausserhalb der Klasse:
    
    bool operator != (const Fraction& lhs, const Fraction& rhs);
    

    gruß
    syntax



  • ok alles klar. danke für die hilfe ich probiers gleich mal aus



  • ok jetzt hat alles funktioniert.muss mir das mit dem this zeiger einfach nochmal anschauen.


Anmelden zum Antworten