Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:classes [2020/04/14 07:31] – [Οι μέθοδοι της κλάσης] gthanos | cpp:classes [2021/05/06 23:56] – [Κλάσεις και Αντικείμενα] gthanos |
---|
</code> | </code> |
| |
Η παραπάνω κλάση διαθέτει τα πεδία τύπου //int width, height// και τις μεθόδους //setWidth, setHeight, getWidth, getHeight//. Η κλάση δεν διαθέτει κατασκευαστή. Η δήλωση ''Rect rect;'' στη μέθοδο //main()// δημιουργεί ένα αντικείμενο με κλήση του //default// κατασκευαστή. | Η παραπάνω κλάση διαθέτει τα πεδία τύπου //int width, height// και τις μεθόδους //setWidth, setHeight, getWidth, getHeight//. Η κλάση δεν διαθέτει κατασκευαστή. Η δήλωση ''Rect rect;'' στη μέθοδο //main()// δημιουργεί ένα αντικείμενο με κλήση του //default// κατασκευαστή, ο οποίος δημιουργείται από τον //compiler//, λόγω της έλλειψης κατασκευαστή στον κώδικα. |
| |
===== Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης ===== | ===== Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης ===== |
| |
Στο προηγούμενο παράδειγμα, η δήλωση της κλάσης και η υλοποίηση των μεθόδων (συναρτήσεων) της κλάσης βρίσκονται στο ίδιο αρχείο. Η δήλωση στο ίδιο αρχείο της κλάσης και των μεθόδων της δεν είναι συνήθης πρακτική. Αντ' αυτού, η δήλωση της κλάσης δηλώνεται σε ένα header file με το όνομα της κλάσης και κατάληξη ''.hpp'' ή ''.h'', ενώ η υλοποίηση των μεθόδων σε ένα αρχείο ''.cpp'' με το ίδιο όνομα. Η κλάση //Rectangle// που αναφέρεται παραπάνω θα πρέπει να "σπάσει" σε δύο αρχεία ως εξής: | Στο προηγούμενο παράδειγμα, η δήλωση της κλάσης και η υλοποίηση των μεθόδων (συναρτήσεων) της κλάσης βρίσκονται στο ίδιο αρχείο. Η δήλωση στο ίδιο αρχείο της κλάσης και των μεθόδων της δεν είναι συνήθης πρακτική. Αντ' αυτού, η δήλωση της κλάσης δηλώνεται σε ένα header file με το όνομα της κλάσης και κατάληξη ''.hpp'' ή ''.h'', ενώ η υλοποίηση των μεθόδων σε ένα αρχείο ''.cpp'' με το ίδιο όνομα. Η κλάση //Rectangle// που αναφέρεται παραπάνω θα πρέπει να χωριστεί σε δύο αρχεία ως εξής: |
| |
<code cpp Rectangle.hpp> | <code cpp Rectangle.hpp> |
</code> | </code> |
| |
Ο λόγος που διακρίνουμε μία κλάση σε δήλωση και υλοποίηση είναι ότι η δήλωση της κλάσης μπορεί να χρειαστεί να συμπεριληφθεί μέσω μιας εντολής ''#include'' από περισσότερα του ενός αρχεία στο ίδιο πρόγραμμα. Η υλοποίηση όμως δεν θέλουμε να συμπεριληφθεί σε περισσότερα του ενός μεταγλωττισμένα αρχεία στο ίδιο πρόγραμμα, διότι ο linker στη συνέχεια θα διαμαρτύρεται ότι η ίδια συνάρτηση υπάρχει περισσότερες από μία φορές μέσα στο πρόγραμμα. Επιπλέον, δεν είναι καλή πρακτική στον αντικειμενοστραφή προγραμματισμό να αποκαλύπτουμε στον προγραμματιστή-χρήστη της κλάσης της εσωτερική υλοποίηση της. Έτσι, μπορούμε να διατηρήσουμε "κρυφή" την υλοποίηση των μεθόδων σε ξεχωριστό αρχείο από τη δήλωση της κλάσης. | Ο λόγος που διακρίνουμε μία κλάση σε δήλωση και υλοποίηση είναι ότι η δήλωση της κλάσης πιθανόν να συμπεριληφθεί μέσω μιας εντολής ''#include'' από περισσότερα του ενός αρχεία στο ίδιο πρόγραμμα. Η υλοποίηση όμως δεν θέλουμε να συμπεριληφθεί σε περισσότερα του ενός μεταγλωττισμένα αρχεία, διότι ο linker στη συνέχεια θα διαμαρτύρεται ότι η ίδια συνάρτηση υπάρχει περισσότερες από μία φορές μέσα στο πρόγραμμα. Επιπλέον, δεν είναι καλή πρακτική στον αντικειμενοστραφή προγραμματισμό να αποκαλύπτουμε στον προγραμματιστή-χρήστη της κλάσης της εσωτερική υλοποίηση της. Έτσι, μπορούμε να διατηρήσουμε "κρυφή" την υλοποίηση των μεθόδων σε ξεχωριστό αρχείο από τη δήλωση της κλάσης. |
| |
<WRAP important 80% center round> | <WRAP important 80% center round> |
===== Πεδία που περιγράφονται από κλάσεις ===== | ===== Πεδία που περιγράφονται από κλάσεις ===== |
| |
Εκτός από πεδία βασικού τύπου μπορούμε να έχουμε και πεδία κλάσεων των οποίων ο τύπος περιγράφεται από κλάσεις. Παράδειγμα μιας τέτοια κλάσης είναι το ορθογώνιο παραλληλεπίπεδο - κυβοειδές (κλάση Cuboid) το οποίο έχει ένα πεδίο τύπου Rectangle που ορίσαμε παραπάνω. | Εκτός από πεδία βασικού τύπου μπορούμε να έχουμε και πεδία κλάσεων των οποίων ο τύπος περιγράφεται από κλάσεις. Παράδειγμα μιας τέτοια κλάσης είναι το ορθογώνιο παραλληλεπίπεδο - κυβοειδές (κλάση Cuboid) το οποίο έχει ένα πεδίο τύπου Rectangle το οποίο ορίσαμε παραπάνω. |
| |
<code cpp Cuboid.hpp> | <code cpp Cuboid.hpp> |