002
13.03.2006, 13:58 Uhr
virtual
Sexiest Bit alive (Operator)
|
Vorweg erstmal: Du solltest Dir angewöhnen, mit dem Umwandlungsoperator sparsam umzugehen. Und wenn Du ihn tatächlich benutzt, dann solltest Auf Contructoren verzichten können, welche als Argument den umgewandelten Typ benutzen. So geschehen in Deinem Beispiel:
C++: |
Counter(int val); ... operator int();
|
Der Grund ist, daß man sonst immer wieder in Situationen reinläuft, die für den Compiler nicht mehr eindeutig auflösbar sind. (Ausdiesem grund bietet zB std::string keinen const char* umwandlungs operator an, siondern macht dies über die Routine c_str()).
Zitat: |
Nun möchte ich
char operator[] (int a1); ODER char operator (int a1) const einsetzen
was ist der unterschied , macht dieser operator die selbe aufgabe ? und wie soll die initialisierung aussehen , was muss man ändern ?, um fehlerfrei zu kompilieren ?
|
Also der Unterschid is, daß ersters eine gültige und zweiteres eine ungültige Operator deklaration darstellt. Vermutlich wolltest Du
C++: |
char operator[] (int a1) const; char operator () (int a1) const;
|
Schreiben? - Naja, der Unterschied ist einfach, daß es unterschiedliche Operatoren sind. Da Du sie implementierst, bist Du auch dafür verantwortlich, daß sie sich an die allg. erwattete Semantik halten. Dh wenn Du schreibst:
C++: |
Counter c; char a; a = c[133]; // op[] überladen
|
Dann würde man wohl erwarten, daß der op[] das Element mit dem Index 133 aus c zurückliefert (was auch immer das ist). Macht diese dein Operator nicht, ist er per se schlecht, weil er es die lesbarkeit des Sources extrem erschwert.
Wenn Du schreibst
C++: |
Counter c; char a; a = c(133); // op() überladen
|
Würde man in der Regel vermutlich erwarten, daß Counter ein Funktor ist, also quasi eine Instantiierbare Funktion. Diese werden in der STL ganz gerne in verbindung mit Algorithmen verwendet.
Generell würde ich mit überladenen Operatoren sehr vorsichtig sein: Operatoren verstecken jede Menge Programmlogik. Und Programmlogik, die nicht direkt sichtbar ist, erschwert das Verstehen von Programmen. Speziell in Deinem Fall gibt es keinen Grund, den op() zu überladen. Da Du ja schon ein GetItsValue hast, ist es sogar redundant. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |