Diskussion:C++-Programmierung/ Eigene Datentypen definieren/ Operatoren überladen

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Im Gegensatz zu:

  "Die Multiplikation ... mit sizeof(m_data[0]) ist nötig, um auch auf Plattformen zu funktionieren, auf denen char größer als ein Byte ist"

ist die FAQ von comp.lang.c++ (C++-FAQ 26.1) der Meinung, sizeof char sei immer 1 (wie auch in C). Den Satz löschen? --212.77.163.104 7:46, 3. Sep. 2010 Unterschrift nachgetragen --Prog 21:14, 7. Dez. 2010 (CET)

Das ist korrekt, ich werde den Text überarbeiten, vielen Dank für den Hinweis. Diskussionsbeiträge bitte mit --~~~~ unterschreiben. --Prog 21:14, 7. Dez. 2010 (CET)

Operatoren "<" und ">"[Bearbeiten]

Erstmal danke für das Buch, es hilft mir sehr. Aber eine Sache ist mir aufgefallen:
Zitat: "Es gibt für die Implementierung zwei Möglichkeiten, zum einen könnten wir ihn als Kombination aus den anderen Operatoren implementieren, zum anderen könnten wir aber auch eine Implementierung schreiben, welche dem Kleiner-Operator ähnlich ist."
Eine andere Möglichkeit wäre diese:

   bool operator>(MyString const& lhs, MyString const& rhs){
        return rhs < lhs;
   }

Dann könnte man auch die Versionen für C-Strings und die kleiner-gleich-Operatoren nicht diese Funktion aufrufen lassen, sondern alle 4 Vergleichsoperatoren könnten nur auf der kleiner-als-Implementierung beruhen. Man hätte keine Codeverdopplung und müsste auch nur einen anderen Operator aufrufen, was der Performance zugute kommt.

Wenn ich dich richtig verstehe, würdest du vorschlagen die strcmp-Funktion für die Implementierung von operator< zu verwenden? Das wird für diese Implementierung des Strings nicht funktionieren, da die Daten intern nicht als Null-terminierter String gespeichert werden. strcmp Hätte somit keine Möglichkeit festzustellen wie "lang" das char-Array ist. Außerdem sollen in diesem Buch möglichst keine C-Funktionen genutzt werden. Für memcpy mache ich da eine Ausnahme, da dies die Performance massiv steigern kann und die Funktion außerdem relativ häufig auch in C++ Code zu sehen ist. Allgemein gilt, für eine Implementierung von Vergleichsoperatoren, die eine Codeverdopplung vermeiden, werden immer mindesten ein == oder != und ein <, <=, > oder >=-Operator mit "umfangreicher" Implementierung benötigt. Für eine Performance Implementierung muss ebenfalls ein == oder != umfangreich Implementiert sein zusätzlich sind aber ein < oder <= und ein > oder >=-Operator erforderlich. Bei der Codeverdopplungsvermeidenen Implementierung muss bei 2 Operatoren auf beide Umfangreiche Implementierungen zugegriffen werden, bei der Performanten können die drei verbleibenden jeweils als Negation von nur einem der drei Anderen geschrieben werden. Gruß --Prog 21:14, 7. Dez. 2010 (CET)