This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:copy_constructors [2021/05/07 08:35] gthanos [Μια πιο σύνθετη περίπτωση] |
cpp:copy_constructors [2022/05/12 19:41] gthanos [Πιο σύνθετες περιπτώσεις] |
||
|---|---|---|---|
| Line 23: | Line 23: | ||
| int getHeight(); | int getHeight(); | ||
| }; | }; | ||
| + | </ | ||
| + | |||
| + | <code cpp Rectangle.cpp> | ||
| + | #include " | ||
| Rectangle:: | Rectangle:: | ||
| Line 29: | Line 33: | ||
| } | } | ||
| - | Rectangle:: | + | Rectangle:: |
| cout << " | cout << " | ||
| width = s; height = s; | width = s; height = s; | ||
| Line 64: | Line 68: | ||
| {{ : | {{ : | ||
| - | Το ερώτημα είναι με ποιό τρόπο γίνεται η δημιουργία του αντιγράφου του αρχικού αντικειμένου στο //stack//. Μπορείτε να δηλώσετε τον δικό σας κατασκευαστή αντιγραφέα (λεπτομέρειες πιο κάτω..) ή να αφήσετε τον // | + | Το ερώτημα είναι με ποιό τρόπο γίνεται η δημιουργία του αντιγράφου του αρχικού αντικειμένου στο //stack//. Μπορείτε να δηλώσετε τον δικό σας κατασκευαστή αντιγραφέα (λεπτομέρειες πιο κάτω..) ή να αφήσετε τον // |
| ===== Ορισμός ενός κατασκευαστή αντιγραφέα ===== | ===== Ορισμός ενός κατασκευαστή αντιγραφέα ===== | ||
| Line 99: | Line 103: | ||
| Rectangle(int s); | Rectangle(int s); | ||
| Rectangle(); | Rectangle(); | ||
| - | Rectangle(Rectangle& | + | Rectangle(const Rectangle& |
| void setWidth(int w); | void setWidth(int w); | ||
| void setHeight(int h); | void setHeight(int h); | ||
| Line 105: | Line 109: | ||
| int getHeight(); | int getHeight(); | ||
| }; | }; | ||
| + | </ | ||
| + | |||
| + | <code cpp Rectangle.cpp> | ||
| + | #include " | ||
| Rectangle:: | Rectangle:: | ||
| Line 168: | Line 176: | ||
| </ | </ | ||
| - | ===== Μια πιο σύνθετη περίπτωση | + | ===== Πιο σύνθετες περιπτώσεις ===== |
| + | |||
| + | ==== 1η Περίπτωση | ||
| Στις περιπτώσεις που υπάρχουν πεδία που είναι δείκτες και δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) εάν δεν ορίσετε τον δικό σας κατασκευαστή αντιγραφέα, | Στις περιπτώσεις που υπάρχουν πεδία που είναι δείκτες και δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) εάν δεν ορίσετε τον δικό σας κατασκευαστή αντιγραφέα, | ||
| Line 231: | Line 241: | ||
| Point *getOrigin() const; | Point *getOrigin() const; | ||
| }; | }; | ||
| + | </ | ||
| + | |||
| + | <code cpp Rectangle.cpp> | ||
| + | #include " | ||
| Rectangle:: | Rectangle:: | ||
| Line 262: | 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 275: | Line 283: | ||
| Rectangle r1{5, | Rectangle r1{5, | ||
| Rectangle r2 = r1; | Rectangle r2 = r1; | ||
| - | Rectangle r3(r1); | ||
| - | | ||
| - | moveOrigin(r1, | ||
| } | } | ||
| </ | </ | ||
| Line 286: | Line 291: | ||
| < | < | ||
| - | *** Error in `./ | + | free(): |
| - | Ακυρώθηκε | + | Aborted |
| </ | </ | ||
| Line 311: | 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) | ||
| + | </ | ||
| + | |||
| + | Η δημιουργία του κατασκευαστή αντιγραφέα που προτάθηκε παραπάνω λύνει και αυτό το πρόβλημα. | ||