cpp:copy_constructors
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:copy_constructors [2021/05/07 08:35] – [Μια πιο σύνθετη περίπτωση] gthanos | cpp:copy_constructors [2022/05/12 19:41] (current) – [Πιο σύνθετες περιπτώσεις] 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) | ||
+ | </ | ||
+ | |||
+ | Η δημιουργία του κατασκευαστή αντιγραφέα που προτάθηκε παραπάνω λύνει και αυτό το πρόβλημα. |
cpp/copy_constructors.1620376559.txt.gz · Last modified: 2021/05/07 07:36 (external edit)