Vector sortieren



  • Danke, bekomme aber folgende Compilerfehlermeldung:

    C:\Program Files\Microsoft Visual Studio 10.0\VC\include\algorithm(41): error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'gefunden' akzeptiert (oder keine geeignete Konvertierung möglich)
    ......

    meine Klasse "gefunden" schau so aus:

    class gefunden
    	{
    	public:
    		gefunden(){}
    		gefunden(double Theta, double distance1, double distance2, int aX, int aY, int bX, int bY, int mX, int mY, int anzahl, double B): Theta(Theta), distance1(distance1), distance2(distance2), aX(aX), aY(aY), bX(bX), bY(bY), mX(mX), mY(mY), anzahl(anzahl), B(B)  {}
    
    		double getTheta(){ return Theta; }
    		double getDistance1(){ return distance1; }
    		double getDistance2(){ return distance2; }
    		int getaX(){ return aX; }
    		int getaY(){ return aY; }
    		int getbX(){ return bX; }
    		int getbY(){ return bY; }
    		int getmX(){ return mX; }
    		int getmY(){ return mY; }
    		int getanzahl(){ return anzahl; }
    		friend std::ostream& operator<<(std::ostream& ostr, const gefunden& p)
    		{
    			ostr << p.aX << " " << p.aY << "\n";
    			return ostr;
    		}
    		double getB(){ return B; }
    		double Theta, distance2, distance1, B;
    		int aX, aY, bX, bY, mX, mY, anzahl;
    	};
    


  • Implementiere Vergleichsoperatoren.



  • ich verstehe nicht ganz.





  • Aber ich verstehe nicht warum ich eine Überladung von Operatoren genau jetzt brauche?

    class gefunden
    	{
    	public:
    		gefunden(){}
    		gefunden(double Theta, double distance1, double distance2, int aX, int aY, int bX, int bY, int mX, int mY, int anzahl, double B): Theta(Theta), distance1(distance1), distance2(distance2), aX(aX), aY(aY), bX(bX), bY(bY), mX(mX), mY(mY), anzahl(anzahl), B(B)  {}
    
    		double getTheta(){ return Theta; }
    		double getDistance1(){ return distance1; }
    		double getDistance2(){ return distance2; }
    		int getaX(){ return aX; }
    		int getaY(){ return aY; }
    		int getbX(){ return bX; }
    		int getbY(){ return bY; }
    		int getmX(){ return mX; }
    		int getmY(){ return mY; }
    		int getanzahl(){ return anzahl; }
    		double getB(){ return B; }
    		double Theta, distance2, distance1, B;
    		int aX, aY, bX, bY, mX, mY, anzahl;
    	};
    typedef std::vector<gefunden> found;
    .
    .
    .
    .
    finden.push_back(gefunden(45.21, 21.21, 345.32, 2, 3, 65, 432, 32, 45, 1, 4.0123));
    .
    .
    .
    for (found::iterator ilt = finden.begin(); ilt != finden.end(); ilt = find(ilt + 1, finden.end(), most1))
        {
    		cout << (*ilt).getaX() << "  x  " << (*ilt).getaY() << "          " << (*ilt).getbX() << "   x   " << (*ilt).getbY() << "    " << (*ilt).getB() << endl;
        }  // Ab der Schleife kommt auf einmal diese Operator Fehlermeldung.
    


  • Weil std::find zum Finden eine Möglichkeit haben muss, um zu Vergleichen, ob es sich um das gleiche Element handelt.



  • und wie müsste dass dann ausschauen, weil mein Operator nicht funktioniert.



  • Walpurgisnacht schrieb:

    und wie müsste dass dann ausschauen, weil mein Operator nicht funktioniert.

    Steht im Link oben von jhkhjk unter 3.8 😉



  • OK, danke. Ist eigentlich gar nicht so schwer :p
    Ich bekomme jetzt nur noch als Fehlermeldung vom Compiler, dass ich zu viele Parameter benutze

    bool operator==(gefunden const& lhs, gefunden const& rhs) { return &lhs == &rhs; }
    


  • Du hast den Operator hoffentlich ausserhalb der Klasse definiert.

    class gefunden { /* ... */ };
    
    bool operator==(gefunden const& lhs, gefunden const& rhs)
    {
        return &lhs == &rhs;
    }
    


  • Ich dachte man kann einen Operator auf zwei Möglichkeiten definieren: innerhalb der Klasse und außerhalb der Klasse. In Zukunft werd ichs immer außerhalb machen 👍

    Problem bleibt aber weiterhin:

    C:\Program Files\Microsoft Visual Studio 10.0\VC\include\algorithm(41): error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'gefunden' akzeptiert (oder keine geeignete Konvertierung möglich)



  • Versuchs mal damit:

    bool operator==(gefunden const& rhs);
    

    Diese Funktion so in der Klasse definieren. Dann kannst du das linke Objekt über den this-Operator aufrufen.

    PS:
    Bin mir nicht so ganz sicher obs klappt. Probiers mal aus 🙂



  • hmmm, scheint nicht zu funktionieren. Andere Ideen?



  • .....



  • Es hat doch alles davor funktioniert. Nur als die For-Schleife mit dem find() gekommen ist kam diese Fehlermeldung.



  • Lass das const weg bzw. leg eine Version mit const und eine ohne const an.

    Das hier ist so übrigens keine gute Idee:

    return &lhs == &rhs;
    

    Damit vergleichst du nämlich nur die Adressen. Du solltest aber die inneren Werte vergleichen, um zu überprüfen, ob ein Objekt "gleich" ist. Denn es ist unwahrscheinlich das alle Objekte die gleiche Adresse haben. Was viel wahrscheinlicher ist: Sie könnten gleiche Werte haben und darauf kommt es an.



  • Hast du den operator in der Klasse auch als friend deklariert?


Anmelden zum Antworten