Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konstante Methodenvarianten besser mit führendem 'c'?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.12.2009, 21:23 Uhr
Prog



Hi, ich hab gerade mal wieder gelesen, das nach dem aktuellen Entwurf für C++0x einige Methoden mit konstanter Überladung zusätzlich nen Namen mit führendem 'c' spendiert bekommen haben. Insbesondere gibt es z. B. für std::vector


C++:
iterator begin();
const_iterator begin() const;
const_iterator cbegin() const; // äquivalent zu begin()const



Für andere Funktionen wie etwa front() oder data() gibt es diese zusätzlichen "Präfix-"Varianten nicht.

Ich bin nun am überlegen, ob ich für meinen Code ebenfalls solche Varianten einführen soll. Für Iteratoren ist das so gut wie immer sinnvoll.Für direkte Zugriffsmethoden wird, denke ich, hingegen ehr selten lesend auf das angeforderte Datum zugegriffen, wenn das Objekt selbst nicht konstant ist.

Außerdem stört mich, dass zusätzlich zu den "Präfix-"Varianten, immer noch die const-Überladung existiert. Das verleitet dazu, immer begin() zu benutzen, auch wenn nur gelesen werden soll.

Eine Konstantheit kann man natürlich nachträglich immer noch dazu casten, wenn sie gebraucht wird, aber erstens ist das etwas unübersichtlich und zweitens macht das ja auch kaum jemand konsequent. Die "Präfix-"Varianten aufzurufen, wenn nur gelesen werden soll, würde vermutlich häufiger genutzt werden als ein dazu casten der Konstantheit.

Welche Meinung habt ihr dazu?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.12.2009, 21:52 Uhr
0xdeadbeef
Gott
(Operator)


Naja, der neue Standard kann alten Code nicht so ohne weiteres kaputt machen.

Der Gedanke dahinter wird wohl sein, referenzzählende Container mit copy-on-write zu ermöglichen bzw. zu vereinfachen, also würde ich sowas in eigenen Klassen dann einfügen, wenn ich etwas derartiges plane oder die Möglichkeit offen halten will. Algorithmen benutzen im Zweifel eh Iteratoren, also mache ich mir um Templates in dem Zusammenhang weniger Gedanken.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.12.2009, 22:15 Uhr
Prog



Um Templates geht's mir an der Stelle gar nicht (auch wenn ich zur Zeit an ner Template-Klasse schreibe ) und copy-on-write ging bisher auch schon, indem ich, falls mein aktuelles Objekt nicht ohnehin konstant ist, einfach ne Konstantheit dazu caste und anschließend meinen Member aufrufe:


C++:
T objekt;
static_cast< const T >(objekt).begin();
// ist äquivalent zu
objekt.cbegin();



Das ist einfach nur ne vereinfachte Schreibweise für den Aufruf. Ich bin nur nicht sicher, ob diese Vereinfachung in der Anwendung, die zusätzlichen Member in der Schnittstelle aufwiegt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2009, 22:34 Uhr
0xdeadbeef
Gott
(Operator)


Naja,

C++:
objekt.cbegin()


ist schon schöner als

C++:
static_cast<T const&>(objekt).begin()


, zumal man bei letzterem in die Gefahr läuft, wie du eine Kopie des Objektes zu erstellen. Gerade bei Standardcontainern, die je nach Implementierung refcounted sein können oder nicht, hat das schon einen gewissen Wert.

Dagegen ist die Implementierung der begin() const-Methode, wenn man cbegin() hat, ein Einzeiler - nicht gerade viel Aufwand.

Bearbeitung:

Sorum gefällt mir die const-Notation besser


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 09.12.2009 um 22:56 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.12.2009, 22:39 Uhr
Prog



Stimmt, hatte ich vergessen, thx. Hab auch noch mal über ein paar mögliche Situationen nachgegrübelt und bin zu dem Schluss gekommen, dass es in der Regel sinnvoll ist. Besonders wenn man den Datentyp nach C++0x mittels auto ermitteln lässt, statt ihn selbst anzugeben.

Die begin()const werd ich für meinen Kram weglassen, so sind andere Programmierer gezwungen cbegin() zu nutzen falls das Objekt konstant ist. (Auf die Art zwinge ich sie gewissermaßen auf cbegin() aufmerksam zu werden.)

Dieser Post wurde am 09.12.2009 um 22:42 Uhr von Prog editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: