Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?
-
@Th69 Also weist das hd dadurch, dass es vom Typ HeapData ist, automatisch nach Beendigung des Default-Konstruktors auch auf den Heap (beinhaltet also die Adresse vom Heap)? Ich frag mich nur wie man sich das grad am besten vorstellen soll^^
Dann schreibt er ja other = heap, wodurch die Adresse die in Heap gespeichert ist an other übergeben wird. Direkt danach springt der Kopierkonstruktor an, &other verweist dann auf hd, oder halt auf die den Heap, weil selbe Adresse.
Nur warum schreibt er other.data? Das macht für mich einfach überhaupt keinen Sinn^^
-
@SeppJ Er meinte auch, dass man das so nicht machen darf und wollte zeigen, dass es dann zum Absturz kommt.^^ Deswegen ist es so offensichtlich richtig gewesen, wie er das gemacht hat.
Also dann jetzt noch mal Butter bei die Fische: Wie formatiert man hier den Quellcode richtig?
Dann kann ich das eben bearbeiten!
-
Das mit den Zeigern ist, wie schon von uns geschrieben, ein sehr schlechtes Beispiel.
Stell es dir besser mit einer einfachen Zahl vor, z.B.class heapData { public: HeapData() { data = 42; } HeapData(const HeapData &other) { data = other.data; } private: int data; };
Der Sinn eines Kopierkonstruktor besteht eben dadrin, aus einem übergebenen Objekt eine Kopie anzulegen, d.h. die Memberwerte zu übernehmen (wobei Sinn macht dieses Beispiel nur, wenn sich der Datenwert auch zur Laufzeit ändern kann).
Aber bei den meisten Klassen brauchst du keinen eigenen Kopierkonstruktor, sondern beim Kompilieren wird automatisch ein passender Kopierkonstruktor erzeugt oder du schreibst explizit:HeapData(const HeapData &other) = default;
bzw. wenn du ihn nicht haben möchtest:
HeapData(const HeapData &other) = delete;
PS: Editieren geht bei einem Beitrag unten rechts mit dem Menü mit den drei senkrechten Punkten und dort dann "Bearbeiten" auswählen.
-
Welches Video ist das denn? Du könntest ja mal ein Link reinstellen, dann könnte man sich mal angucken, ob das was taugt.
-
@SeppJ Also nochmal wieder im C++ für Dummies mit dem kompletten Kapitel Klassen anfangen? uff
-
@Schlangenmensch
https://www.youtube.com/watch?v=IFVOY0bkpfE&lc=UgyGEXgzDMBFI_MJgal4AaABAg.98-SfNHdTvY98-fqHS7WS
-
@JTR666 sagte in Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?:
@SeppJ Also nochmal wieder im C++ für Dummies mit dem kompletten Kapitel Klassen anfangen? uff
Wäre wahrscheinlich besser, gar nicht solche Bücher zu lesen. C++ ist nicht einfach. Bücher die schnellen ("in 14 Tagen"), einfachen ("für Dummies"), oder vollkommenen ("von A bis Z") Lehrerfolg versprechen, lügen. Diese Bücher fallen hier im Forum auch ständig negativ auf, dass sie Dinge falsch beibringen, veraltetes darstellen, und schlechte Praktiken lehren.
Gute Bücherliste:
https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/388282#388282
-
@JTR666
Das letzte mal als ich eine HeapData Implementierung gesehen habe, hat sich der Verursacher so richtig in Knie geschossen. Aber mit Kanonenkugeln.Lass bitte anfangs die Finger weg von new, delete, malloc, free! Manuelle Speicherverwaltung ist nicht einfach. Nimm STL!
Und wie mein Vorredner sagte, schnapp dir ein gutes Buch und arbeite es durch.
-
@SeppJ Das von Bjarne Stourstroup hab ich sogar hier^^ Nur wollte ich eigentlich zuerst mit dem einen Buch fertig werden und dann das nächste lesen.
Das Problem ist halt nur, dass jedes Buch anders aufgebaut ist.
Wenn in Buch A zuerst das eine und dann das andere Thema behandelt wird, kann es sein, dass das nächste Buch zuerst noch n anderes Thema, dann das andere und dann das eine Thema behandelt. Deswegen es sein kann, dass man für Antworten die Quellcodes aus dem nächsten Buch um sich Thema A beizubringen nicht verstehen kann, weil man dafür eventuell noch was wissen muss, was man noch nicht gelernt hat...
Verstehst du was ich meine?
-
@JTR666 Möglicherweise hat die andere Reihenfolge in einem guten Buch ja ihren Grund ...
-
@manni66
Das habe ich selbstverständlich nicht bestritten!
-
@Quiche-Lorraine Was hat er gemacht?
-
Warum hat er in Zeile 11 data = other.data geschrieben?
Wenn du dem Sprecher im Video zugehört hättest, machst er das, um noch einmal deutlicher zu machen, was der Default-Kopierkonstruktor tut und warum das Programm einen Fehler verursacht. Das ganze Video hat doch genau den Sinn, auf die Dreierregel hinzuweisen.
Gut, am Ende empfiehlt der Videomensch, den Kopierkonstruktor einfach zu löschen, soband man Pointer hat. Auch ne Lösung... Aber einfach vector statt char* verwenden und alles wäre automatisch richtig.
-
Dieser Beitrag wurde gelöscht!
-
@SeppJ Also in dem für Dummies-Buch ist die Reihenfolge so, dass man zuerst grundlegend lernt wie man eine Ausgabe macht, dann wie man sein System einrichtet.
Dann im 2. Kapitel, wie man ein Objekt erstellt (Compiler Code::Blocks).
Im 3. Kapitel wie man Daten speichert (also was Variablen sind, welche Typen es gibt, usw.)
Im 4. Kapitel lernt man was Schleifen und if/else sind.
Das nächste Kapitel bezieht sich dann darauf, wie man sein Werk mit Funktionen aufteilt.
Dann kommt im 6. Kapitel das Aufteilen des Quellcodes dran.
Gefolgt vom 7. Kapitel, welches sich mit Pointern befasst.
Und dann im 8. Kapitel kommen Klassen dran.
Insgesamt gibt es 35 Kapitel auf 820 Seiten...
-
Dieser Beitrag wurde gelöscht!
-
@JTR666 : Ist ja schön, aber ich werde jetzt sicher keine Literaturanalyse machen. Es fällt bloß auf, dass Leute die hier mit "dummen" Fragen und grundlegend falschen Codes auftauchen, überproportional solche Bücher gelesen haben, wohingegen Leute, die Bücher von der mir empfohlenen Art gelesen haben, eher mit coolen Designfragen kommen, wie sie ihre guten Programme noch besser machen können.
-
@titan99_ sagte in Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?:
Also normalerweise will man doch Werte kopieren und keine Adressen?
Dann würde man doch die Pointer dereferenzieren und so die Werte kopieren.
HeapData(const HeapData &other) { auto other_data = other.data; *data = *other_data; }
Bin mir jetzt nicht sicher, wie eine Membervariable direkt dereferenziert wird. Deshalb die zusätzliche Zeile.
Ähh, du solltest das Kapitel wohl selber wiederholen. Da ist alles falsch. Das würde nur das erste Element eines Feldes kopieren, aber es stürzt sowieso in dem Moment ab, wo du den undefinierten Zeiger
data
dereferenzierst. Das macht auch keinen Sinn, hier eine temporäre Variable zu nutzen, selbst wenn der Rest richtig wäre, was den Verdacht aufkommen lässt, dass du denkst, dass hier ganz was anderes passiert, als eigentlich passiert.
-
@SeppJ Also nochmal bei 0 anfangen?
-
@SeppJ Also ist das data im Kopierkonstruktor nicht der Pointer data aus Klasse der als private deklariert wurde?