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:16] – [Ορισμός ενός κατασκευαστή αντιγραφέα] gthanoscpp:copy_constructors [2017/04/20 12:46] – [Δημιουργία κατασκευαστών αντιγραφέων] gthanos
Line 80: Line 80:
 Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο //compiler// δημιουργεί έναν από μόνος του αντιγράφοντας τα περιεχόμενα του αρχικού αντικειμένου στο νέο πεδίο προς πεδίο. Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο //compiler// δημιουργεί έναν από μόνος του αντιγράφοντας τα περιεχόμενα του αρχικού αντικειμένου στο νέο πεδίο προς πεδίο.
 </WRAP> </WRAP>
 +
 +Μία άλλη περίπτωση κατά την οποία θα κληθεί o κατασκευαστής αντιγραφέας είναι η παρακάτω. Εδώ μαζί με την δήλωση της μεταβλητής γίνεται ανάθεση των πεδίων του αντικειμένου //r1// στο //r2//
 +
 +<code cpp CopyRectangle.cpp>
 +#include "Rectangle.cpp"
 +
 +int main() {
 +  Rectangle r1(5,6);
 +  Rectangle r2 = r1;
 +}
 +</code>
  
 ==== Δημιουργία κατασκευαστών αντιγραφέων ==== ==== Δημιουργία κατασκευαστών αντιγραφέων ====
Line 153: Line 164:
 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 159: Line 172:
 #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