Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?
-
@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?
-
@JTR666 sagte in Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?:
@SeppJ Also ist das data im Kopierkonstruktor nicht der Pointer data aus Klasse der als private deklariert wurde?
Warum sollte er das nicht sein?
-
@manni66 Eben.^^
Das hab ich mich halt auch gefragt^^
-
Dieser Beitrag wurde gelöscht!
-
int* int_pointer; *int_pointer = *other_int_pointer;
Und wohin wird da jetzt kopiert?
funktioniert = stürzt nicht sofort ab, sondern erst später
-
...und außerdem war im Original
char *data =new char[27]
. Also 27 chars. Und die 27 war einfach mal so gewählt. Was, wenn du in einer Instanz 27 und in der anderen 13476 Chars hast? Das geht so nicht, du müsstest neuen Speicher reservieren usw. Und woher soll der Compiler bei*data = *other.data
irgendwas über Längen wissen?!
-
@titan99_ sagte in Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?:
Ob es sinnvoll ist und ob Türen für andere Fehler geöffnet werden, ist eine andere, Frage finde ich.
Es wäre dazu gedacht gewesen, um den Unterschied zu zeigen, wenn man Adressen in Pointern kopiert oder Adressen in Pointer dereferenziert und so die Werte kopiert, was ja auch dem Namen Copy entspricht.
So sollte es etwas besser sein.
int int_variable; int* int_pointer = &int_variable; ^ Address-of operator *int_pointer = *other_int_pointer; ^ ^ Dereference operator
-
-
@JTR666 sagte in Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?:
@SeppJ Also nochmal bei 0 anfangen?
Na, bevor du weiter Quatsch lernst. Je mehr Quatsch du lernst, desto schwieriger wird es, diesen zu vergessen. Besonders weit bist du ja noch nicht, insofern ist jetzt ja noch ein guter Zeitpunkt zu wechseln.
Falls du das anders siehst, stell' dir mal vor, du würdest ein Instrument oder einen Sport anhand von Internetvideos lernen und gingest jetzt zu einem professionellen Lehrer/Trainer. Und der sagt dir, dass du dir eine falsche Haltung angewöhnt hast, weil dich bisher niemand korrigiert hat. Würdest du darauf bestehen, so weiter zu machen, wie bisher? Wohl hoffentlich nicht, auch dann nicht, wenn dir die neue Haltung vom Trainer zuerst schwer fällt, und du damit anfangs Sachen nicht schaffst, die du mit deiner falschen Haltung schon konntest.
-
@JTR666 sagte in Kann mir jemand eben erklären, wie die Kopierkonstruktoren mit Referenzparameter funktionieren?:
@Quiche-Lorraine Was hat er gemacht?
Er hat eine Speicherverwaltung für einen Uralt-Controller geschrieben. Dazu hat er einen Großteil des RAMs (32 kByte) für sich beansprucht und eigene HeapNew() und HeapDelete() Funktionen geschrieben. Und da er die Speicherverwaltung sich selbst organisierend machte um Fragmentierung zu vermeiden, lieferten HeapNew() und HeapDelete() nur IDs zurück. Eine Funktion HeapPtr() lieferte zu einer ID den Pointer zurück.
Und dann wollte eine Funktion beispielsweise eine Liste kopieren und machte folgendes:
// Bestimmte Pointer auf zu kopierendes Array tMyArray* Array = HeapPtr(ArrayID); // Lege neues Array an int NewArrayID = HeapNew(sizeof(tMyArray)); tMyArray* NewArray = HeapPtr(NewArrayID); // Kopiere Elemente for (i = 0; i < Array->Count; i++) { NewID = HeapNew(4); memcpy(GetPtr(NewID), GetPtr(Array->Data[i]), 4); NewArray->Data[i] = NewID; NewArary->Count++; }
Den Fehler sieht man auf den ersten Blick nicht. Aber das HeapNew() organisierte manchmal den Speicher um s.d. alle Zeiger auf dem Speicherbereich ungültig wurden und auf potenziell ungültige Daten zeigten.
Und das dumme daran, es stürzte noch nicht einmal ab. Der Zeiger konnte nach einer HeapNew() auf einmal auf einen Speicherbereich zeigen welcher von anderen Funktionen benutzt wurden. Und dann kopierte die Funktion halt Daten nach irgentwo.
Das ganze funktionierte in 99% der Fälle aber in 1% der Fälle verursachte es schwer nachvollziehbare Datenverluste.
Und dann portierte er das ganze auf Windows.
Als ich die Speicherreservierung auf std::vector umstellte, stürzte mir das Programm erst einmal ab. Und das war auch gut so. Denn nur so fand ich den Fehler.
PS:
Aber auch so etwas habe ich schon gesehen:#include <stdio.h> #include <vector> int main () { std::vector<int> L{1}; int* L1 = &L[0]; for (int i = 0; i < 20; i++) { printf("%i ", *L1); L.push_back(i); } return 0;
}