Klasse die sich selbst als Pointer sieht
-
Vereinfacht:
X* Get(SmartPtr<X> p); X* Get(X x); SmartPtr<X> ptr; Get(*p); // !
Aber das war ohnehin nur eine Bemerkung am Rande. Das kommt derart selten vor, da lohnt es sich nicht stundenlang darüber zu diskutieren. Bei einem besseren Namen als "Get" kommt die Situation erst recht nie vor. Ich habe ja noch andere Punkte genannt und wollte primär aussagen, dass ich die Variante mit der freien Funktion nicht für so viel besser halte wie hier dargestellt. Und wenn ich sie verfechtete, würde ich andere Argumente in den Vordergrund rücken (z.B. Generizität).
-
Nexus schrieb:
Wie gesagt: Da gibt es noch einiges zu tun, um eine robuste Semantik zu gewährleisten.
- Konstruktor
explicit
- Zuweisungsoperator von rohem Zeiger entfernen
operator bool
durch Safe-Bool-Idiom ersetzen, da sonst Dinge wiea == b
mit unerwartetem Ergebnis möglich sindgetptr()
darf eigentlich Nullzeiger zurückgeben, daher keinassert
verwenden
Versteh ich soweit alles aber was hat es mit dem safe bool auf sich und wieso darf ich den Zuweisungsoperator für rohe Zeiger nicht benutzen?
MfG
Scarabol
- Konstruktor
-
Google wird dir weiterhelfen.
-
Schade
-
Dein Code erlaubt folgendes:
if(ptr + 42) { play_sound("booom.wav"); message_box("buffer overflow"); return 666; }
Dafür kanst du das Safe-Bool Idiom anwenden:
class smartpointer { //... private: void some_mem_func(){} typedef void(smartpointer::* bool_t)(); public: operator bool_t () { return ptr ? &smartpointer::some_mem_func : 0; } //... };
-
Achso cool danke.
MfG
Scarabol
-
Das Rad, was du jetzt erfindest, wird ecking sein. Wenn Du es hinsichtlich
Flexibilität und Benutzungsfehleranfälligkeit "abrundest", wird dann so etwas wie boost::scoped_ptr oder std::unique_ptr rauskommen. Die haben all die Kinderkrankheiten nicht mehr. Letzteren smart pointer gibt's offiziell leider noch nicht, kommt aber in der nächsten C++ Version.
-
Bei scoped_ptr macht mich folgender Satz stutzig:
T * operator->() const; // never throws
Returns the stored pointer. Behavior is undefined if the stored pointer is 0.Soll also heißen, dass die Klasse auch nicht so perfekt ist oder?
MfG
Scarabol
-
Scarabol schrieb:
Soll also heißen, dass die Klasse auch nicht so perfekt ist oder?
Wie? In welchem Kontext soll die Dereferenzierung eines Nullzeigers erlaubt sein?
-
Es soll ja nicht erlaubt sein, aber ein assert währe doch sehr wünschenswert finde ich.
MfG
Scarabol
-
Da wird mit Sicherheit ein assert drin sein. Aber was macht man im Release-Modus? Denn ein Fall für eine Exception ist es m.E. nicht.
-
Im Release macht man einfach gar nichts. Speicherzugriffsverletzung, Ende.
Im Release ist ein assert ja leer.
-
Genau. Und deswegen ist es eben UB und keine Imperfektion der Klasse.
-
Doch
Erst wenn im Debug alles klappt, schaltet man i.d.R. auf Release um, und im Release sollte die bestmögliche Performance möglich sein
-
Nichts anderes sagt ipsec. Natürlich ist eine Klasse nicht schlecht, wenn sie im Release-Modus bei falscher Benutzung UB erzeugt.
-
Ok, das habe ich dann wohl falsch gelesen, sorry.