User Tools

Site Tools


cpp:destructors

This is an old revision of the document!


Καταστροφείς της κλάσης

Σε αναλογία με τον κατασκευαστή της κλάσης η C++ δηλώνει και τον καταστροφέα της κλάσης. Ο καταστροφέας της κλάσης επιτρέπει να γίνουν οι απαραίτητες εργασίες καθαρισμού για το αντικείμενο που καταστρέφεται. Για παράδειγμα είναι πιθανόν κατά την δημιουργία του αντικειμένου να έχει δεσμευθεί μνήμη την οποία πρέπει να ελευθερώσουμε ή να έχουν ανοιχθεί αρχεία τα οποία κατά την καταστροφή του αντικειμένου πρέπει να τα κλείσουμε.

Στο παρακάτω παράδειγμα βλέπετε την κλάση Rectangle όπου τα πεδία width και height είναι δείκτες. Σε αυτή την περίπτωση θα πρέπει να δεσμεύουμε την απαραίτητη μνήμη με χρήση του τελεστή new. Στον καταστροφέα την κλάσης απελευθερώνουμε τη μνήμη που δεσμεύσαμε προηγούμενα.

Rectangle.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
 
class Rectangle {
  private:
    int *width, *height;
  public:
    Rectangle(int w, int h);
    ~Rectangle();
    void setWidth(int w);
    void setHeight(int h);
    int getWidth();
    int getHeight();
};
 
Rectangle::Rectangle(int w, int h) {
  width = new (nothrow) int;    
  height = new (nothrow) int;
  if(width == NULL || height == NULL) {
    cerr << "Memory allocation failure!\n";
    exit(-1);
  }
  *width = w; *height = h;
  cout << "Constructing rectangle (w:"<< *width <<", h:"<<*height<<")\n";
}
 
Rectangle::~Rectangle() {
  cout << "Destructing rectangle (w:"<< *width <<", h:"<<*height<<")\n";
  delete width;
  delete height;
}
 
void Rectangle::setWidth(int w) { *width = w; }
void Rectangle::setHeight(int h) { *height = h; }
int Rectangle::getWidth() { return *width; }
int Rectangle::getHeight() { return *height; }
 
int main () {
  Rectangle rect(5,6);
  cout << "area: " << rect.getWidth() * rect.getHeight() << endl;
  return 0;
}
cpp/destructors.1586342071.txt.gz · Last modified: 2020/04/08 09:34 (external edit)