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:20] – [Ορισμός ενός κατασκευαστή αντιγραφέα] gthanoscpp:copy_constructors [2017/04/20 12:50] – [Ορισμός ενός κατασκευαστή αντιγραφέα] gthanos
Line 77: Line 77:
 </code> </code>
  
-<WRAP center round tip 60%>+<WRAP center round tip 80%>
 Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο //compiler// δημιουργεί έναν από μόνος του αντιγράφοντας τα περιεχόμενα του αρχικού αντικειμένου στο νέο πεδίο προς πεδίο. Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο //compiler// δημιουργεί έναν από μόνος του αντιγράφοντας τα περιεχόμενα του αρχικού αντικειμένου στο νέο πεδίο προς πεδίο.
 </WRAP> </WRAP>
Line 91: Line 91:
 } }
 </code> </code>
 +
 +<WRAP center round tip 80%>
 +Το παραπάνω είναι λειτουργικά ισοδύναμο με το παρακάτω.
 +<code cpp CopyRectangle.cpp>
 +#include "Rectangle.cpp"
 +
 +int main() {
 +  Rectangle r1(5,6);
 +  Rectangle r2;
 +  r2 = r1;
 +}
 +</code>
 +Για τον μεταγλωττιστή όμως οι κώδικες είναι διαφορετικοί. Στην πρώτης περίπτωση καλείται ο κατασκευαστής αντιγραφέας, ενώ στη 2η περίπτωση καλείται ο //default// κατασκευαστής και στη συνέχεια γίνεται ανάθεση των πεδίων του //r1// στα πεδία του //r2//.
 +</WRAP>
  
 ==== Δημιουργία κατασκευαστών αντιγραφέων ==== ==== Δημιουργία κατασκευαστών αντιγραφέων ====
Line 164: Line 178:
 int Rectangle::getWidth() { return width; } int Rectangle::getWidth() { return width; }
 int Rectangle::getHeight() { return height; } int Rectangle::getHeight() { return height; }
 +void Rectangle::setOrigin(Point *p) { origin = p; }
 +Point *Rectangle::getOrigin() { return origin; }
 </code> </code>
  
Line 170: Line 186:
 #include "Rectangle.cpp" #include "Rectangle.cpp"
  
 +int moveOrigin(Rectangle &r, int dx, int dy) { 
 +  Point *p = r.getOrigin(); 
 +  p->setX(p->getX() + dx); 
 +  p->setY(p->getY() + dy); 
 +}
  
 int main() { int main() {
   Point *p = new Point(10,5);   Point *p = new Point(10,5);
-  Rectangle r1(5,6,p);+  Rectangle r1(5,6,p);   
 +  Rectangle r2 = r1;
      
-  Rectangle rect(5,6,4,1);+  moveOrigin(r11,-1);
 } }
- 
 </code> </code>
 +
 +Ο παραπάνω κώδικας αντιγράφει στο αντικείμενο //r2// τα πεδία του αντικειμένου //r1// πεδίο προς πεδίο. Αυτό σημαίνει ότι τα αντικείμενα //r1// και //r2// μοιράζονται το ίδιο αντικείμενο τύπου //Point//. Εάν μεταβληθούν οι συντεταγμένες του //Point// από το αντικείμενο //r1//, η μεταβολή θα ισχύει και για το αντικείμενο //r2//. Εάν θέλετε να αποφύγετε αυτή τη συμπεριφορά θα πρέπει να ορίσετε τον δικό σας κατασκευαστή αντιγραφέα που κάνει τα εξής:
 +  - Δημιουργεί ένα νέο αντικείμενο τύπου //Point//.
 +  - Αντιγράφει τα περιεχόμενα του παλιού στο νέο.
 +Ο προτεινόμενος κατασκευαστής αντιγραφέας δίνεται παρακάτω:
 +<code cpp>
 +Rectangle::Rectangle(Rectangle &r) {
 +  width = r.width;
 +  height = r.height;
 +  origin = new (nothrow) Point(r.getOrigin()->getX(), r.getOrigin()->getY());
 +  if(origin == NULL) {
 +    cerr << "Memory allocation failure!";
 +    exit(-1);
 +  }
 +}
 +</code> 
 +
  
  
cpp/copy_constructors.txt · Last modified: 2022/05/12 19:41 by gthanos