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 revisionBoth sides next revision
cpp:copy_constructors [2017/05/10 06:58] – [Δημιουργία κατασκευαστών αντιγραφέων] gthanoscpp:copy_constructors [2017/05/10 07:07] gthanos
Line 153: Line 153:
     int getWidth();     int getWidth();
     int getHeight();     int getHeight();
-    void setOrigin(Point *p) { origin = p} +    void setOrigin(Point *p); 
-    Point *getOrigin() { return origin}+    Point *getOrigin();
 }; };
  
Line 198: Line 198:
  
 <code cpp MoveOrigin.cpp> <code cpp MoveOrigin.cpp>
- 
 #include "Rectangle.cpp" #include "Rectangle.cpp"
  
Line 205: Line 204:
   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 218: Line 212:
      
   moveOrigin(r1, 1,-1);   moveOrigin(r1, 1,-1);
-  moveOrigin(r2, 2, 0); 
 } }
 </code> </code>
  
-Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//Μετά την ολοκλήρωση κλήσης της πρώτης moveOrigin το αντίγραφο του αντικειμένου r1 θα καταστραφεί ελευθερώνοντας τη δεσμευμένη μνήμη για το πεδίο origin. Η αμέσως επόμενη κλήση της moveOrigin Θα παράγει segmentation fault.+Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//Ισχύουν επομένως τα εξής: 
 +  * Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2// 
 +  * Κατά την έξοδο από τη συνάρτηση main, το αντικείμενο //r1// θα καταστραφεί ελευθερώνοντας τη δεσμευμένη μνήμη για το πεδίο του //origin//. Η προσπάθεια καταστρροφής του αντικειμένου //r2// θα οδηγήσει σε σφάλμα διότι θα προσπαθήσει να ελευθερώσει μία περιοχή μνήμης που έχει ήδη ελευθερωθεί κατά την καταστροφή του //r1//. Το σφάλμα που εκτυπώνεται όταν το πρόγραμμα μεταγλωττιστεί με //g++// είναι το εξής: 
 + 
 +<code> 
 +*** Error in `./a.out': double free or corruption (fasttop): 0x00000000006d6010 *** 
 +Ακυρώθηκε (core dumped) 
 +</code> 
 Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής: Για να αποφύγετε την παραπάνω συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής:
   - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.   - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.
cpp/copy_constructors.txt · Last modified: 2022/05/12 19:41 by gthanos