User Tools

Site Tools


cpp:copy_constructors

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
cpp:copy_constructors [2017/04/20 12:56] – [Δημιουργία κατασκευαστών αντιγραφέων] gthanoscpp:copy_constructors [2017/05/10 06:58] – [Δημιουργία κατασκευαστών αντιγραφέων] gthanos
Line 81: Line 81:
 </WRAP> </WRAP>
  
-Μία άλλη περίπτωση κατά την οποία θα κληθεί o κατασκευαστής αντιγραφέας είναι η παρακάτω. Εδώ μαζί με την δήλωση της μεταβλητής γίνεται ανάθεση των πεδίων του αντικειμένου //r1// στο //r2//+Μία άλλη περίπτωση κατά την οποία θα κληθεί o κατασκευαστής αντιγραφέας είναι η παρακάτω. Εδώ μαζί με την δήλωση της μεταβλητής καλείται ο κατασκευαστής αντιγραφέας του //r1// με όρισμα το //r2//
  
 <code cpp CopyRectangle.cpp> <code cpp CopyRectangle.cpp>
Line 205: Line 205:
   p->setX(p->getX() + dx);   p->setX(p->getX() + dx);
   p->setY(p->getY() + dy);   p->setY(p->getY() + dy);
 +}
 +
 +void print(Rectangle r) {
 +  cout << "[" << r.getOrigin().getX() << "," << r.getOrigin().getY() << "] ";
 +  cout << "width: " << r.getWidth() << ", height: " << getHeight() << endl;
 } }
  
Line 213: Line 218:
      
   moveOrigin(r1, 1,-1);   moveOrigin(r1, 1,-1);
 +  moveOrigin(r2, 2, 0);
 } }
 </code> </code>
  
-Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//Εάν θέλετε να αποφύγετε αυτή τη συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής:+Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//Μετά την ολοκλήρωση κλήσης της πρώτης moveOrigin το αντίγραφο του αντικειμένου r1 θα καταστραφεί ελευθερώνοντας τη δεσμευμένη μνήμη για το πεδίο origin. Η αμέσως επόμενη κλήση της moveOrigin Θα παράγει segmentation fault. 
 +Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής:
   - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.   - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.
   - Αντιγράφει τα περιεχόμενα του παλιού στο νέο.   - Αντιγράφει τα περιεχόμενα του παλιού στο νέο.
cpp/copy_constructors.txt · Last modified: 2022/05/12 19:41 by gthanos