1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Instanzen von einer Klasse vergleichen

  • Caps333
  • 11. Februar 2007 um 22:43
  • Unerledigt
  • Caps333
    3
    Caps333
    Mitglied
    Punkte
    85
    Beiträge
    11
    • 11. Februar 2007 um 22:43
    • #1

    Hallo,
    ich bin noch ein C++ Anfänger. Ich würde gerne zwei Instanzen einer Klassen auf Gleichheit überprüfen, der Compiller spuckt aber immer folgenden Fehler aus:
    error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'cZahl' akzeptiert (oder keine geeignete Konvertierung möglich)

    Hier folgt der Code:

    Code
    #include <iostream>
    using namespace std;
    
    
    class cZahl {
        public:
            int Wert1;
            int Wert2;
    
    
         cZahl ();
    
    };
    
    
    cZahl::cZahl() {
        Wert1 = 1;
        Wert2 = 1;
    }
    
    
    int main () {
        cZahl Zahl1;
        cZahl Zahl2;
    
    
        if (Zahl1 == Zahl2)
            cout << "Identisch." << endl;
        else
            cout << "Verschieden." << endl;
    
    
        return 0;
    }
    Alles anzeigen


    Hoffentlich könnt ihr mir helfen, denn ohne das Vergleichen von Instanzen werd ich nicht weit kommen :frowning_face:

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    Punkte
    7.120
    Beiträge
    1.390
    • 11. Februar 2007 um 22:54
    • #2

    ja, du musst eine methode schreiben, die die structs auf gleichheit überprüft (vergleich der einzelnen werte). die nennst du dann am besten isEqual o.ä. theoretisch könntest du auch noch den == operator überladen, aber das würde ich dir, wenn du ein anfänger bist, eher nicht raten :)

  • Paulchen
    1
    Paulchen
    Gast
    • 11. Februar 2007 um 23:43
    • #3
    Zitat von mdk

    theoretisch könntest du auch noch den == operator überladen, aber das würde ich dir, wenn du ein anfänger bist, eher nicht raten :)

    Aber warum denn? Ist doch ganz einfach (das bring sogar ich als C++-Newbie zusammen :)):

    Code
    class cZahl {
        public:
            /* ... */
    
    
            boolean operator==(cZahl &compare);
    };
    
    
    bool cZahl::operator==(cZahl &compare) {
        /* hier den Code fuer den Vergleich von this mit compare reinschreiben */
    }
    Alles anzeigen

    So ungefähr sollts jedenfalls gehen :winking_face:

  • phudy
    10
    phudy
    Mitglied
    Reaktionen
    12
    Punkte
    1.087
    Beiträge
    182
    • 12. Februar 2007 um 00:21
    • #4

    "ungefähr".... der parametertyp in der methode ist auf einmal File anstelle von cZahl :winking_face:

    na dann lass mich mal was versuchen:

    PHP
    #include <iostream>
    
    
    using namespace std;
    
    
    class cZahl {
        public:
            int Wert1;
            int Wert2;
    
    
         cZahl ();
         bool Equal(const cZahl & other) const;
    };
    
    
    cZahl::cZahl() {
        Wert1 = 1;
        Wert2 = 1;
    }
    
    
    
    
    bool cZahl::Equal(const cZahl & other) const {
        return ((Wert1 == other.Wert1) && (Wert2 == other.Wert2));
    }
    bool operator == (const cZahl & compareThis, const cZahl & compareThat) {
        return compareThis.Equal(compareThat);
    }
    bool operator != (const cZahl & compareThis, const cZahl & compareThat) {
        return !(compareThis.Equal(compareThat));
    }
    
    
    
    
    int main () {
        cZahl Zahl1;
        cZahl Zahl2;
        // Zahl1.Wert2 = 2;
    
    
        if (Zahl1 == Zahl2)
            cout << "Gleich." << endl; // sie sind NICHT identisch, aber gleich
        else
            cout << "Verschieden." << endl;
    
    
        return 0;
    }
    Alles anzeigen

    ach, c++ ist schon huebsch, nur geht mir ein garbage collector ab...

    ps: identitaet (identisch) heisst, dass zwei objekte sich quasi auf dem selben speicherplatz befinden (es existiert eigentlich nur ein objekt, aber man kann auf dieses mit zwei variablen zugreifen). gleichheit besteht dann, wenn alle attribute beider objekte uebereinstimmen (was in dem bsp geprueft wird).
    somit sind identische objekte immer automatisch auch gleich -boah, zuviel "objektorientierte programmierung" intus :grinning_squinting_face:

  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 12. Februar 2007 um 00:33
    • #5

    http://de.wikipedia.org/wiki/C-Plusplus/CLI

    aber dann denk ist ist es besser gleich c# zu nehmen

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • Paulchen
    1
    Paulchen
    Gast
    • 12. Februar 2007 um 12:15
    • #6
    Zitat von Vevusio

    http://de.wikipedia.org/wiki/C-Plusplus/CLI

    aber dann denk ist ist es besser gleich c# zu nehmen

    Microsoft Visual Studio 2005... brrr....

    Wo sind brauchbare Implementierungen von C++/CLI und C# für Nicht-MS-Plattformen?

  • Caps333
    3
    Caps333
    Mitglied
    Punkte
    85
    Beiträge
    11
    • 12. Februar 2007 um 22:07
    • #7

    Danke phudy und alle anderen. Hat perfekt funktioniert :)

  • kubuntu
    6
    kubuntu
    Mitglied
    Reaktionen
    2
    Punkte
    352
    Beiträge
    65
    • 12. Februar 2007 um 23:30
    • #8
    Zitat von phudy

    ach, c++ ist schon huebsch, nur geht mir ein garbage collector ab...

    dein wunsch wird dir im naechsten c++ standard ?2009? erfuellt.


  • EnriqueS
    1
    EnriqueS
    Mitglied
    Punkte
    10
    Beiträge
    2
    • 27. Februar 2007 um 13:30
    • #9
    Zitat von phudy

    ...

    PHP
    bool cZahl::Equal(const cZahl & other) const {
        return ((Wert1 == other.Wert1) && (Wert2 == other.Wert2));
    }

    es gibt vl. noch eine elegantere methode um die equal - funktion zu implementieren, und zwar ohne, dass der code davon abhängig ist welche membervariablen in den einzelnen klassen tatsächlich stecken:

    bool cZahl::Equal(const cZahl & other) const {
    return !memcmp (this, &other, sizeof (cZahl)) ;
    }

    damit kann man auch sehr leicht klassen vergleichen die mehr als nur die 2 ints beinhalten, ohne, dass man dabei jedes mal die equal funktion verändern & erweitern müsste.

    ein nachteil dieser variante ist natürlich, dass sie i.A. nicht mehr funktioniert, wenn die klasse pointer (beispielsweise strings, ...) als membervariablen enhält!

    lg, ES

    ¡Otras hijas tienen lindas madres también!

  • djmaecki
    8
    djmaecki
    Mitglied
    Reaktionen
    1
    Punkte
    616
    Beiträge
    119
    • 27. Februar 2007 um 13:44
    • #10
    Code
    class cZahl {
        public:
         int Wert1;
         int Wert2;
         cZahl ();
         friend bool operator== (const cZahl& c1, const cZahl& c2);
    };
    
    
    bool operator== (const cZahl& c1, const cZahl& c2) {
      return c1.Wert1 == c2.Wert1 && c1.Wert2 == c2.Wert2;
    }
    
    
    bool operator!= (const cZahl& c1, const cZahl& c2) {
      return !(c1 == c2);
    }
    Alles anzeigen
  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung