Verständnis "const" pointer
-
@spiri sagte in Verständnis "const" pointer:
Ja, und? Was hindert dich daran das Ding trotzdem als Referenz zurückzugeben?
Referenz worauf denn überhaupt? Reden wir/ihr noch von einer FactoryFunction?
-
Sowas:
int& createInt() { return *(new int(42)); } int main() { int &i = createInt(); // benutze i delete &i; }
Eben furchtbar. Aber bitte, möglich ist das natürlich. Würde ich außer @spiri niemandem empfehlen.
-
@wob
Ich glaube, spiri meinte eher sowas, weil OP den Wert iwo wegspeichert.#include <vector> int& create_int() { static vector<int> data; data.push_back( 5 ); return data.back(); } int main() { int& i = create_int(); }
Wirft halt andere Probleme auf...
-
@It0101 sagte in Verständnis "const" pointer:
Wenn ich eine Referenz zurück bekomme, bedeutet das, dass ich eigentlich gar nicht (alleiniger) Owner von dem Teil bin. Und bei einer Factory würde mich das nerven.
Nochmal: Und inwiefern hilft dir das wenn du einen konstanten Pointer zurückgibst?
@Jockelx sagte in Verständnis "const" pointer:
Referenz worauf denn überhaupt?
Nicht worauf. Sondern statt einem konstanten Pointer.
-
@spiri
Ich glaube, der Konsens ist ein smart Pointer.
-
Aber statt rohen konstanten Zeiger nehm ich lieber gleich eine Referenz
-
@DocShoe sagte in Verständnis "const" pointer:
@wob
Ich glaube, spiri meinte eher sowas, weil OP den Wert iwo wegspeichert.#include <vector> int& create_int() { static vector<int> data; data.push_back( 5 ); return data.back(); } int main() { int& i = create_int(); }
Wirft halt andere Probleme auf...
Besser wäre wohl noch der korrekte Container gewesen
-
@spiri
Aber das sind doch zwei völlig unterschiedliche Dinge:
@wob's Beispiel ist für mich eine Factory-function und die ist so mit der Referenz schlicht gruselig.
@DocShoe's ist doch eher ein getter -auch gruselig- aber ein getter ändert keinen Besitz und da ist eine (const-)Referenz auch prima.
-
Das erste Beispiel ist einfach nur falsch. Das zweite schlecht.
Aber auch für eine Factory würde ich vmtl. mit Referenzen hantieren. Oder eben einem Owner-Objekt.
Aber ganz bestimmt nicht mit einem konstanten Pointer.
-
@spiri
Dann zeig doch mal Code für den Fall, den du dir vorstellt. Ich fürchte, hier wird aneinander vorbeigeredet.
-
Das zweite schlecht weil hier vector verwendet wird und die älteren Verweise nach jedem push_back() kaputt macht.
-
@spiri
Das war nicht die Frage, bzw. willst du jetzt vector durch list ersetzen und dann wäre das Beispiel von DocShoe okay für dich?
-
@Jockelx sagte in Verständnis "const" pointer:
@spiri
Das war nicht die Frage, bzw. willst du jetzt vector durch list ersetzen und dann wäre das Beispiel von DocShoe okay für dich?
Ja
-
z.T. spiri kann ich nur sagen: Die Funktion zum Blocken von Benutzern ist für mich der grösste Mehrwert der neuen Forumssoftware. Denn wenn ich den Rotz den manche Trolle (absichtliche oder unabsichtliche) hier so ablassen lesen muss, dann kann ich nicht anders als mich zu ärgern. So blocke ich jetzt die diversen Kandidaten einfach und hab meine Ruhe. (Und nein, ich hab hier nicht zig User geblockt, im Moment sind es genau zwei.)
-
@spiri sagte in Verständnis "const" pointer:
@Jockelx sagte in Verständnis "const" pointer:
Referenz worauf denn überhaupt?
Nicht worauf. Sondern statt einem konstanten Pointer.
?? Bei einer Referenz stellt sich immer die Frage des "worauf". Wenn wir von Referenzen reden, dann reden wir immer davon, dass das Objekt irgendwo "wohnt" und wir uns eine Referenz auf dieses Objekt beschaffen.
Mit T* ( oder artverwandten Dingen ) muss dieser Wohnort nicht existieren, weil wir mit der Übernahme des Zeigers auf das Objekt aus der Factory-Funktion auch das Ownership übernehmen. Im Gegensatz zur Referenz.
-
@It0101 sagte in Verständnis "const" pointer:
Bei einer Referenz stellt sich immer die Frage des "worauf".
Was für ein Quatsch. Eine Referenz nimmst du und zeigt ein Leben lang auf das selbe Objekt. Worauf?
@It0101 sagte in Verständnis "const" pointer:
Mit T* ( oder artverwandten Dingen ) muss dieser Wohnort nicht existieren
Ein Zeiger kann auch null sein. Da muss man schon wissen worauf der zeigt.
@It0101 sagte in Verständnis "const" pointer:
weil wir mit der Übernahme des Zeigers auf das Objekt aus der Factory-Funktion auch das Ownership übernehmen
So ein Quatsch
-
Mittlerweile stimme ich HustBaer zu: du bist wirklich ein Troll, aber ich hab es wenigstens versucht.
Wenn dich deine Factory-Funktion mit Referenz glücklich macht, dann mach das halt so... Aber wenn irgendwie alle anderen anderer Meinung sind, würde mich das zumindest zum Nachdenken anregen.
-
Das war kein Trolling
-
@It0101 sagte in Verständnis "const" pointer:
Mit T* ( oder artverwandten Dingen ) muss dieser Wohnort nicht existieren, weil wir mit der Übernahme des Zeigers auf das Objekt aus der Factory-Funktion auch das Ownership übernehmen. Im Gegensatz zur Referenz.
Das ist aber nur eine lang gepflegte Tradition bei Zeigern auf Objekten, und es ermöglichte schon immer den Missbrauch, weil man dem Zeiger nicht ansieht, ob der Besitzt auch übertragen wird. Aus diesem Grund wurden ja die Smartpointer entwickelt: shared_ptr, unique_ptr (dieser funktioniert erst seit C++11 so richtig wegen des move) und weak_ptr, die exakt anzeigen wie es mit dem Besitzt aussieht, und den Besitzt automatisch steuern. Bei neu zu schreibenden Code drängen sich die Smartpointer deshalb auf.
-
@john-0 sagte in Verständnis "const" pointer:
@It0101 sagte in Verständnis "const" pointer:
Mit T* ( oder artverwandten Dingen ) muss dieser Wohnort nicht existieren, weil wir mit der Übernahme des Zeigers auf das Objekt aus der Factory-Funktion auch das Ownership übernehmen. Im Gegensatz zur Referenz.
Das ist aber nur eine lang gepflegte Tradition bei Zeigern auf Objekten, und es ermöglichte schon immer den Missbrauch, weil man dem Zeiger nicht ansieht, ob der Besitzt auch übertragen wird. Aus diesem Grund wurden ja die Smartpointer entwickelt: shared_ptr, unique_ptr (dieser funktioniert erst seit C++11 so richtig wegen des move) und weak_ptr, die exakt anzeigen wie es mit dem Besitzt aussieht, und den Besitzt automatisch steuern. Bei neu zu schreibenden Code drängen sich die Smartpointer deshalb auf.
Das war es auch was ich mit "artverwandten Dingen" meinte.