operator == eines structs; Unterschied zu friend operator



  • #include <vector>
    #include <string>
    //#include <algorithm>
    using std::string;
    using std::vector;
    //using std::find;
    
    struct DateiInfo {
      string Name;
      string Pfad;
      DateiInfo(string name, string pfad)
      : Name(name)
      , Pfad(pfad) {}
    
      bool operator == (const DateiInfo& rhs) {
        if(Name != rhs.Name) 
          return false;
        return true;
      }
    };
    

    Das funktioniert gut - also es lässt sich kompilieren, zum Testen komme ich erst noch.

    Es gibt ja auch den friend operator ==. Was ist der Unterschied und hat dieser einen Vorteil gegenüber "meinem" operator == ?

    //Edit
    % in & geändert!



  • Was hat denn das Prozentzeichen da zu suchen? 😕



  • Ach in einer Headerdatei, welche ich immer einbinde, steht aus Kompabilitätsgründen dieses hier:

    #define % &
    

    *grins* -- ich hab's schon geändert. Danke für den Hinweis



  • hehejo schrieb:

    Es gibt ja auch den friend operator ==. Was ist der Unterschied und hat dieser einen Vorteil gegenüber "meinem" operator == ?

    friend operator==( const DateiInfo& lhs, const DateiInfo& rhs )
    

    Ist eine freie Funktion, kein Member.

    hehejo schrieb:

    Das funktioniert gut - also es lässt sich kompilieren, zum Testen komme ich erst noch.

    Dann solltest du auch dies testen:

    const DateiInfo cdi("foo", "bar");
    DateiInfo di(cdi);
    di == cdi;
    

    hehejo schrieb:

    if(Name != rhs.Name)
          return false;
        return true;
    

    Geht das noch verdrehter? 😃



  • finix schrieb:

    Dann solltest du auch dies testen:

    const DateiInfo cdi("foo", "bar");
    DateiInfo di(cdi);
    di == cdi;
    

    Was könnte da denn passieren??
    Also es klappt zumindest. Wobei ich mich wundere, dass die Zuweisung funktioniert. Ich habe ja gar keinen passenden Konstruktor geschrieben.

    finix schrieb:

    hehejo schrieb:

    if(Name != rhs.Name)
          return false;
        return true;
    

    Geht das noch verdrehter? 😃

    Was ist daran verdreht? Wenn die Namen ungleich sind, dann geh ich raus.
    Ich hab's mir irgendwie angewöhnt über's "NICHT GLEICH" zu gehen.
    Natürlich hätt ich auch

    return Name == rhs.Name;
    

    schreiben können.



  • hehejo schrieb:

    Ich hab's mir irgendwie angewöhnt über's "NICHT GLEICH" zu gehen.

    return !(Name != rhs.Name);
    

    Denke auch über einen Umstieg auf NAND nach ;).
    http://de.wikipedia.org/wiki/NAND-Gatter

    Aus NAND-Gattern allein lassen sich alle logischen Verknüpfungen zusammenstellen, weshalb sie in der Digitaltechnik die Rolle eines Standardbausteins spielen.



  • hehejo schrieb:

    Ach in einer Headerdatei, welche ich immer einbinde, steht aus Kompabilitätsgründen dieses hier:

    #define % &
    

    *grins* -- ich hab's schon geändert. Danke für den Hinweis

    Keine Modulo-Operationen im Sourcecode?



  • Gut, das mit dem Modulo ist so eine Sache.. Tja.. 1:0 für dich!


  • Mod

    in diesem falle macht es keinen grossen unterschied ob die funktion eine member oder frei (friend ist hier an sich unnötig, da du nur auf public member zugreifst) ist. der primäre grund, weshalb man in der regel freistehende funktionen bevorzugt, ist, dass bei memberfunktionen keine argumentkonversion (aussser T -> T const ) stattfindet, was zu asymmetrien führt, wenn solche konvertierungen erwünscht sind - wenn man z.b irgendwelche arithmetische typen, die mit build-in typen zusammenarbeiten sollen, bastelt. in deinem falle macht das keinen unterschied, da es keinen typ gibt, der implizit in DateiInfo konvertierbar wäre. freistehende funktionen sehen hier aber evtl. trotzdem schöner aus, da die argumente - welche bei == ja gleichrangig sind - hier auch symmetrisch behandelt werden und nicht eines durch this herausgestellt ist. übrigens ist es möglich in einer friend deklaration die funktion direkt zu definieren - das ist bei templates nützlich, weil man sich so das stupide wiederholen langer parameterlisten spart:

    struct DateiInfo {
      string Name;
      string Pfad;
      DateiInfo(string name, string pfad)
      : Name(name)
      , Pfad(pfad) {}
    
      friend bool operator == (const DateiInfo& lhs, const DateiInfo& rhs) {
        return lhs.Name == rhs.Name;
      }
    };
    


  • hehejo schrieb:

    finix schrieb:

    Dann solltest du auch dies testen:

    const DateiInfo cdi("foo", "bar");
    DateiInfo di(cdi);
    di == cdi;
    

    Was könnte da denn passieren??
    Also es klappt zumindest. Wobei ich mich wundere, dass die Zuweisung funktioniert. Ich habe ja gar keinen passenden Konstruktor geschrieben.

    Mein Fehler. Meinte eigentlich "cdi == di;", soll heißen du hast ein const vergessen.

    Copy Constructor & op= schreibt der Compiler für dich.



  • finix schrieb:

    Mein Fehler. Meinte eigentlich "cdi == di;", soll heißen du hast ein const vergessen.

    Das versteh ich nicht.



  • hehejo schrieb:

    finix schrieb:

    Mein Fehler. Meinte eigentlich "cdi == di;", soll heißen du hast ein const vergessen.

    Das versteh ich nicht.

    Dann probier's aus. 💡


Log in to reply