cpp:copy_constructors
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
cpp:copy_constructors [2019/03/06 20:06] – [Δημιουργία κατασκευαστών αντιγραφέων] gthanos | cpp:copy_constructors [2019/04/19 09:45] – gthanos | ||
---|---|---|---|
Line 26: | Line 26: | ||
Ένας κατασκευαστής αντιγραφέας για την κλάση Rectangle θα μπορούσε να είναι ο εξής: | Ένας κατασκευαστής αντιγραφέας για την κλάση Rectangle θα μπορούσε να είναι ο εξής: | ||
+ | <code cpp> | ||
+ | Rectangle:: | ||
+ | width = r.width; height = r.height; | ||
+ | } | ||
+ | </ | ||
+ | ή ο παρακάτω | ||
<code cpp> | <code cpp> | ||
Rectangle:: | Rectangle:: | ||
Line 32: | Line 38: | ||
</ | </ | ||
- | Η μεταβλητή //r// δηλώνεται ως //const// διότι κατά την εκτέλεση του κατασκευαστή το αντικείμενο //r// δεν | + | Στη 2η περίπτωση, |
- | <code cpp Rectangle.cpp> | + | <code cpp Rectangle.hpp> |
#include < | #include < | ||
#include < | #include < | ||
Line 47: | Line 53: | ||
Rectangle(int s); | Rectangle(int s); | ||
Rectangle(); | Rectangle(); | ||
+ | Rectangle(Rectangle &r); | ||
void setWidth(int w); | void setWidth(int w); | ||
void setHeight(int h); | void setHeight(int h); | ||
Line 54: | Line 61: | ||
Rectangle:: | Rectangle:: | ||
+ | cout << " | ||
width = w; height = h; | width = w; height = h; | ||
} | } | ||
- | Rectangle:: | + | Rectangle:: |
- | | + | |
} | } | ||
- | Rectangle:: | + | Rectangle:: |
- | srand(time(NULL)); | + | |
- | | + | |
} | } | ||
- | // copy constructor | ||
Rectangle:: | Rectangle:: | ||
+ | cout << " | ||
width = r.width; height = r.height; | width = r.width; height = r.height; | ||
} | } | ||
Line 75: | Line 82: | ||
int Rectangle:: | int Rectangle:: | ||
int Rectangle:: | int Rectangle:: | ||
+ | |||
+ | void printArea(Rectangle r) { | ||
+ | cout << " area: " << r.getWidth() * r.getHeight() << endl; | ||
+ | } | ||
</ | </ | ||
<WRAP center round tip 80%> | <WRAP center round tip 80%> | ||
- | Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο // | + | Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο // |
</ | </ | ||
+ | |||
+ | ==== Άλλη περίπτωση κλήση Copy Constructor ==== | ||
Μία άλλη περίπτωση κατά την οποία θα κληθεί o κατασκευαστής αντιγραφέας είναι η παρακάτω. Εδώ η δήλωση της μεταβλητής r2 συμπίπτει με την αρχικοποίηση του αντικειμένου. Σε αυτή την περίπτωση καλείται ο κατασκευαστής αντιγραφέας με όρισμα το // | Μία άλλη περίπτωση κατά την οποία θα κληθεί o κατασκευαστής αντιγραφέας είναι η παρακάτω. Εδώ η δήλωση της μεταβλητής r2 συμπίπτει με την αρχικοποίηση του αντικειμένου. Σε αυτή την περίπτωση καλείται ο κατασκευαστής αντιγραφέας με όρισμα το // | ||
Line 106: | Line 119: | ||
</ | </ | ||
- | ===== Δημιουργία κατασκευαστών αντιγραφέων ===== | + | ===== Μια πιο σύνθετη περίπτωση ===== |
- | Στις περιπτώσεις που υπάρχουν πεδία δείκτες που δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) αντιγράφονται οι διευθύνσεις αυτές, όπως θα αντιγράφονταν οποιοδήποτε άλλο πεδίο. Αυτό πρακτικά σημαίνει ότι δύο ή περισσότερα αντικείμενα δείχνουν σε μία κοινή περιοχή μνήμης. Το παραπάνω μπορεί να προκαλέσει δυσλειτουργίες καθώς η μεταβολή του κοινού αντικειμένου επηρεάζει το σύνολο των αντικειμένων που το μοιράζονται. | + | Στις περιπτώσεις που υπάρχουν πεδία δείκτες που δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) αντιγράφονται οι διευθύνσεις αυτές, όπως θα αντιγράφονταν οποιοδήποτε άλλο πεδίο. Αυτό πρακτικά σημαίνει ότι δύο ή περισσότερα αντικείμενα δείχνουν σε μία κοινή περιοχή μνήμης. Το παραπάνω μπορεί να προκαλέσει δυσλειτουργίες, καθώς η μεταβολή του κοινού αντικειμένου επηρεάζει το σύνολο των αντικειμένων που το μοιράζονται. |
Στο παρακάτω παράδειγμα ορίζουμε την κλάση //Point// η οποία αντιπροσωπεύει ένα σημείο στο διδιάστατο χώρο. | Στο παρακάτω παράδειγμα ορίζουμε την κλάση //Point// η οποία αντιπροσωπεύει ένα σημείο στο διδιάστατο χώρο. | ||
Line 226: | Line 239: | ||
Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής: | Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής: | ||
- Δημιουργεί ένα νέο αντικείμενο τύπου //Point//. | - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//. | ||
- | - Αντιγράφει τα περιεχόμενα του παλιού στο νέο. | + | - Αντιγράφει τα περιεχόμενα του παλιού |
Ο προτεινόμενος κατασκευαστής αντιγραφέας δίνεται παρακάτω: | Ο προτεινόμενος κατασκευαστής αντιγραφέας δίνεται παρακάτω: |
cpp/copy_constructors.txt · Last modified: 2022/05/12 19:41 by gthanos