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/05/10 06:14] – [Ορισμός ενός κατασκευαστή αντιγραφέα] 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 216: Line 215:
 </code> </code>
  
-Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//Εάν θέλετε να αποφύγετε αυτή τη συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής:+Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //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