const Funktion über Pointer aushebeln
-
Bei der suche nach einen Memory Leak bin ich über folgenden Code gestolpert.
class ClassA { public: ClassA() { pClassB = new ClassB; } ~ClassA() {} ClassB* getPtr() const { return pClassB; } private: ClassB *pClassB; };Ok Memory Leak gefunden!!! Ganz einfach.
Nö ist es nicht.
Im Code wird die Klasse 'ClassA' benutzt um 'ClassB' zu erzeugen.
Diese Klasse wird dann über die Funktion getPtr() const in eine andere Klasse Transferiert wo diese dann zerstört wird.Wir hatten dann eine kleine Diskusion über das const hinter der Funktion.
Kollege hat die Meinung das C++ dieses ja Zulässt und am eigentlichen Pointer ja nichts geändert wird. Also durchaus const Korrekt ist.Meine Frage ist: Ist das in C++ so das hier der Pointer keine Const Problem verursacht obwohl der ganze Code mehr als nur Überdenkenswert ist.
BeiDemThemaNicht kein Name

-
C++ achtet nur darauf, dass innerhalb einer const-Funktion nichts (bitweise) verändert wird. Alles andere ist ihm egal. Da muss der Author etwas mitdenken.
Das Design ist soweit abstrahiert absolut schlecht. Factory ist in Ordnung, aber nicht das...
-
Was ist der Zweck dieser Klasse? Sie verstößt gegen jeden guten Geschmack.
Ich weiß jetzt auch nicht, was Du hören willst. Vielleicht stellst Du Deine Frage mal präzieser. Was verstehst Du unter "const problem"?
-
@IchBinImmerUnreg
> nichts "bitweise" verändert wird <<
Danke, das war das was ich suchte.
@krümelkacker
Das ist die einzige Funktion der Klasse. Es gibt noch mehr solcher Klassen.> Sie verstößt gegen jeden guten Geschmack.
Mmm da hätte ich noch ganz andere "Ausdrücke" für.
Der ganze Code darum sieht noch viel Schlimmer aus.
BeiDemThemaNicht
-
Was das
constheißt, darfst du selber bestimmen, der Compiler kann die Logik dahinter nicht verstehen und prüft nur das schon erwähnte. Wenn diegetPtrMethode nur auf konstante Referenzen aufgerufen werden soll, dann gehört da dasconsthin, damit die Klasse const Korrekt ist.
-
brotbernd schrieb:
Wenn die
getPtrMethode nur auf konstante Referenzen aufgerufen werden soll, dann gehört da dasconsthin, damit die Klasse const Korrekt ist.Etwas anders formuliert bedeutet das: eine Klasse ist const-korrekt wenn sie const-korrekt ist.
Finde ich gut
-
Siehe hierzu: http://xkcd.com/703/
-
Genau

-
hustbaer schrieb:
eine Klasse ist const-korrekt wenn sie const-korrekt ist.
Nina Hagen würde wohl damit antworten:
class Foo { public: Foo & getInternals() const { return *const_cast<Foo*>(this); } };
-
Wenn einem der Cast stört, folgendes ist auch valide:
class Foo { int a, * b; public: Foo() : a(0), b(&a) {} void set_a(int a) const { *b = a; } };Allerdings ist das schon mehr als nur dreckig. Dann doch lieber den Cast oder sich überlegen, ob man nicht etwas falsch macht.

-
Paul Müller schrieb:
Wenn einem der Cast stört, folgendes ist auch valide:
Dann doch lieber einfach mutable

-
hustbaer schrieb:
brotbernd schrieb:
Wenn die
getPtrMethode nur auf konstante Referenzen aufgerufen werden soll, dann gehört da dasconsthin, damit die Klasse const Korrekt ist.Etwas anders formuliert bedeutet das: eine Klasse ist const-korrekt wenn sie const-korrekt ist.
Finde ich gut
Oder etwas allgemeiner: Etwas ist richtig, wenn es richtig ist.
-
what is, is.