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/04/20 11:44] gthanoscpp:copy_constructors [2017/04/20 12:16] – [Ορισμός ενός κατασκευαστή αντιγραφέα] gthanos
Line 76: Line 76:
 int Rectangle::getHeight() { return height; } int Rectangle::getHeight() { return height; }
 </code> </code>
 +
 +<WRAP center round tip 60%>
 +Εάν δεν ορίσετε ένα δικό σας κατασκευαστή αντιγραφέα ο //compiler// δημιουργεί έναν από μόνος του αντιγράφοντας τα περιεχόμενα του αρχικού αντικειμένου στο νέο πεδίο προς πεδίο.
 +</WRAP>
 +
 +==== Δημιουργία κατασκευαστών αντιγραφέων ====
 +
 +Στις περιπτώσεις που υπάρχουν πεδία δείκτες που δείχνουν σε άλλα αντικείμενα (στατικά ή δυναμικά δεσμευμένα) αντιγράφονται οι διευθύνσεις αυτές, όπως θα αντιγράφονταν οποιοδήποτε άλλο πεδίο. Αυτό πρακτικά σημαίνει ότι δύο ή περισσότερα αντικείμενα δείχνουν σε μία κοινή περιοχή μνήμης. Το παραπάνω μπορεί να προκαλέσει δυσλειτουργίες καθώς η μεταβολή του κοινού αντικειμένου επηρεάζει το σύνολο των αντικειμένων που το μοιράζονται.
 +
 +Στο παρακάτω παράδειγμα ορίζουμε την κλάση //Point// η οποία αντιπροσωπεύει ένα σημείο στο διδιάστατο χώρο.
 +
 +<code cpp Point.cpp>
 +#include <iostream>
 +using namespace std;
 +
 +class Point {
 +    int x, y;
 +  public:
 +    Point(int vx,int vy) { x = vx; y = vy; cout << "Point regular constructor!\n"; }
 +    Point(const Point &p) { x = p.x; y = p.y; cout << "Point copy constructor!\n"; }      
 +    Point() { cout << "Point default constructor!\n"; }
 +    ~Point() { cout << "xP Point destructor!\n"; }
 +    void setX(int vx) { x = vx; }
 +    void setY(int vy) { y = vy; }
 +    int getX() { return x; }
 +    int getY() { return y; }
 +};
 +</code>
 +
 +Η κλάση //Rectangle// που ακολουθεί ορίζει ένα πεδίο δείκτη σε αντικείμενα τύπου //Point//. Η δημιουργία ενός αντικειμένου τύπου //Rectangle// συνεπάγεται τη δυναμική δέσμευση μνήμης για το αντικείμενο τύπου //Point// που αυτή περιέχει. Δείτε το παράδειγμα που ακολουθεί.
 +
 +<code cpp Rectangle.cpp>
 +#include <iostream>
 +#include <cstdlib>
 +#include <ctime>
 +using namespace std;
 +
 +#include "Point.cpp"
 +
 +class Rectangle {
 +  private:
 +    int width, height;
 +    Point *origin;
 +  public:
 +    Rectangle(int w, int h, Point *p);
 +    Rectangle(int s, Point *p);
 +    Rectangle();
 +    void setWidth(int w);
 +    void setHeight(int h);
 +    int getWidth();
 +    int getHeight();
 +};
 +
 +Rectangle::Rectangle(int w, int h, Point *p) {
 +  width = w; height = h;
 +  origin = p;
 +}
 +
 +Rectangle::Rectangle(int s, Point *p) {
 +  width = s; height = s;
 +  origin = p;
 +}
 +
 +Rectangle::Rectangle() {
 +  srand(time(NULL));
 +  width = rand() % 10 + 1; height = rand() % 10 + 1;
 +  origin = new (nothrow) Point{};
 +  if(origin == NULL) {
 +    cerr << "Memory allocation failure!\n";
 +    exit(-1);
 +  }
 +}
 +
 +void Rectangle::setWidth(int w) { width = w; }
 +void Rectangle::setHeight(int h) { height = h; }
 +int Rectangle::getWidth() { return width; }
 +int Rectangle::getHeight() { return height; }
 +</code>
 +
 +<code cpp MoveOrigin.cpp>
 +
 +#include "Rectangle.cpp"
 +
 +
 +
 +int main() {
 +  Point *p = new Point(10,5);
 +  Rectangle r1(5,6,p);
 +  
 +  Rectangle rect(5,6,4,1);
 +}
 +
 +</code>
 +
 +
 +
 +
 +
 +
 +
cpp/copy_constructors.txt · Last modified: 2022/05/12 19:41 by gthanos