cpp:copy_constructors
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| cpp:copy_constructors [2022/05/12 19:08] – [Μια πιο σύνθετη περίπτωση] gthanos | cpp:copy_constructors [2022/05/12 19:41] (current) – [Πιο σύνθετες περιπτώσεις] gthanos | ||
|---|---|---|---|
| Line 178: | Line 178: | ||
| ===== Πιο σύνθετες περιπτώσεις ===== | ===== Πιο σύνθετες περιπτώσεις ===== | ||
| - | /* | + | ==== 1η Περίπτωση - Αρχικοποίηση ενός αντικειμένου |
| - | ==== 1η Περίπτωση - Αρχικοποίηση ενός αντικειμένου από άλλο αντικείμενο | + | |
| - | */ | + | |
| Στις περιπτώσεις που υπάρχουν πεδία που είναι δείκτες και δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) εάν δεν ορίσετε τον δικό σας κατασκευαστή αντιγραφέα, | Στις περιπτώσεις που υπάρχουν πεδία που είναι δείκτες και δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) εάν δεν ορίσετε τον δικό σας κατασκευαστή αντιγραφέα, | ||
| Line 243: | Line 241: | ||
| Point *getOrigin() const; | Point *getOrigin() const; | ||
| }; | }; | ||
| + | </ | ||
| + | |||
| + | <code cpp Rectangle.cpp> | ||
| + | #include " | ||
| Rectangle:: | Rectangle:: | ||
| Line 274: | Line 276: | ||
| </ | </ | ||
| - | <code cpp MoveOrigin.cpp> | + | <code cpp CopyRectangle.cpp> |
| #include " | #include " | ||
| - | |||
| - | int moveOrigin(Rectangle &r, int dx, int dy) { | ||
| - | Point *p = r.getOrigin(); | ||
| - | p-> | ||
| - | p-> | ||
| - | } | ||
| int main() { | int main() { | ||
| Line 287: | Line 283: | ||
| Rectangle r1{5, | Rectangle r1{5, | ||
| Rectangle r2 = r1; | Rectangle r2 = r1; | ||
| - | Rectangle r3(r1); | ||
| - | | ||
| - | moveOrigin(r1, | ||
| } | } | ||
| </ | </ | ||
| Line 298: | Line 291: | ||
| < | < | ||
| - | *** Error in `./ | + | free(): |
| - | Ακυρώθηκε | + | Aborted |
| </ | </ | ||
| Line 323: | Line 316: | ||
| </ | </ | ||
| + | ==== 2η Περίπτωση - Κλήση συνάρτησης με παράμετρο αντικείμενο που περιέχει δυναμικά δεσμευμένα πεδία ==== | ||
| + | |||
| + | <code cpp MoveOrigin.cpp> | ||
| + | #include " | ||
| + | |||
| + | int moveOrigin(Rectangle r, int dx, int dy) { | ||
| + | Point *p = r.getOrigin(); | ||
| + | p-> | ||
| + | p-> | ||
| + | } | ||
| + | |||
| + | int main() { | ||
| + | Point p{5,5}; | ||
| + | Rectangle r1{5, | ||
| + | | ||
| + | moveOrigin(r1, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Η κλήση της συνάρτησης moveOrigin θα απαιτήσει τη δημιουργία ενός αντιγράφου του r1 στο stack για τις ανάγκες της εκτέλεσης της συγκεκριμένης συνάρτησης. Εφόσον δεν έχουμε δημιουργήσει κατασκευαστή αντιγραφέα, | ||
| + | |||
| + | Κατά την έξοδο από τη συνάρτηση η κοινή αυτή περιοχή θα καταστραφεί, | ||
| + | |||
| + | < | ||
| + | free(): double free detected in tcache 2 | ||
| + | Aborted (core dumped) | ||
| + | </ | ||
| + | |||
| + | Η δημιουργία του κατασκευαστή αντιγραφέα που προτάθηκε παραπάνω λύνει και αυτό το πρόβλημα. | ||
cpp/copy_constructors.1652382480.txt.gz · Last modified: 2022/05/12 19:08 by gthanos
