Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:classes [2020/04/12 15:05] – [Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης] gthanos | cpp:classes [2021/04/27 07:52] – [Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης] gthanos |
---|
===== Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης ===== | ===== Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης ===== |
| |
Στο προηγούμενο παράδειγμα, η δήλωση της κλάσης και η υλοποίηση των μεθόδων (συναρτήσεων) της κλάσης βρίσκονται στο ίδιο αρχείο. Η δήλωση στο ίδιο αρχείο της κλάσης και των μεθόδων της δεν είναι συνήθης πρακτική. Αντ' αυτού, η δήλωση της κλάσης δηλώνεται σε ένα header file με το όνομα της κλάσης και κατάληξη ''.hpp'' ή ''.h'', ενώ η υλοποίηση των μεθόδων σε ένα αρχείο ''.cpp'' με το ίδιο όνομα. Η κλάση //Rectangle// που αναφέρεται παραπάνω θα πρέπει να "σπάσει" σε δύο αρχεία ως εξής: | Στο προηγούμενο παράδειγμα, η δήλωση της κλάσης και η υλοποίηση των μεθόδων (συναρτήσεων) της κλάσης βρίσκονται στο ίδιο αρχείο. Η δήλωση στο ίδιο αρχείο της κλάσης και των μεθόδων της δεν είναι συνήθης πρακτική. Αντ' αυτού, η δήλωση της κλάσης δηλώνεται σε ένα header file με το όνομα της κλάσης και κατάληξη ''.hpp'' ή ''.h'', ενώ η υλοποίηση των μεθόδων σε ένα αρχείο ''.cpp'' με το ίδιο όνομα. Η κλάση //Rectangle// που αναφέρεται παραπάνω θα πρέπει να χωριστεί σε δύο αρχεία ως εξής: |
| |
<code cpp Rectangle.hpp> | <code cpp Rectangle.hpp> |
Οι δύο παραπάνω τρόποι ορισμού μιας μεθόδου της κλάσης είναι ισοδύναμοι με την διαφορά ότι η μέθοδος //setHeight// ορίζεται ως //inline// ακόμη και εάν η λέξη //inline// δεν αναφέρεται ρητά. Ο λόγος που η //setHeight// γίνεται //inline// είναι για να αποφευχθεί το πρόβλημα των περισσότερων του ενός ορισμών της ίδιας μεθόδου σε επιμέρους μεταγλωττισμένα αρχεία του ιδίου προγράμματος. Ο //compiler// προλαμβάνει το συγκεκριμένο πρόβλημα κάνοντας την μέθοδο //inline//. | Οι δύο παραπάνω τρόποι ορισμού μιας μεθόδου της κλάσης είναι ισοδύναμοι με την διαφορά ότι η μέθοδος //setHeight// ορίζεται ως //inline// ακόμη και εάν η λέξη //inline// δεν αναφέρεται ρητά. Ο λόγος που η //setHeight// γίνεται //inline// είναι για να αποφευχθεί το πρόβλημα των περισσότερων του ενός ορισμών της ίδιας μεθόδου σε επιμέρους μεταγλωττισμένα αρχεία του ιδίου προγράμματος. Ο //compiler// προλαμβάνει το συγκεκριμένο πρόβλημα κάνοντας την μέθοδο //inline//. |
| |
Για τον ορισμό της μεθόδου //setWidth// εκτός της κλάσης είναι απαραίτητη η χρήση του ονόματος της κλάσης ακολουθούμενη από το //scope operator// **Rectangle::**setWidth(int w). Η χρήση του //scope operator// εξασφαλίζει ότι η μέθοδος ανήκει στην κλάση και δεν αποτελεί αυτόνομη μέθοδο του προγράμματος. | Για τον ορισμό της μεθόδου //setWidth// εκτός της κλάσης είναι απαραίτητη η χρήση του ονόματος της κλάσης ακολουθούμενη από το //scope operator// **Rectangle::**setWidth(int w). Η χρήση του //scope operator// εξασφαλίζει ότι η μέθοδος ανήκει στην κλάση και δεν αποτελεί αυτόνομη συνάρτηση του προγράμματος. |
| |
Επιπλέον, οι μέθοδοι //getWidth// και //getHeight// έχουν το προσδιοριστή **const** αμέσως μετά τη δήλωση τους. Ο προσδιοριστής //const// σε αυτή την περίπτωση, δηλώνει ότι η συγκεκριμένη συνάρτηση **δεν μεταβάλλει το αντικείμενο στο οποίο ανήκει**. Η χρήση του προσδιοριστή //const// αποτελεί α) προστασία προς τον προγραμματιστή που υλοποιεί τη μέθοδο, ώστε σε περίπτωση που προσπαθήσει να γράψει ένα πεδίο της κλάσης η μεταγλώττιση να αποτύχει εμφανίζοντας μήνυμα λάθους και β) δήλωση προς τους προγραμματιστές-χρήστες της κλάσης ότι η συγκεκριμένη συνάρτηση δεν θα μεταβάλλει με οποιονδήποτε τρόπο την κατάσταση του αντικειμένου. | Παρατηρήστε ότι οι μέθοδοι //getWidth// και //getHeight// έχουν το προσδιοριστή **const** αμέσως μετά τη δήλωση τους. Ο προσδιοριστής //const// σε αυτή την περίπτωση, δηλώνει ότι η συγκεκριμένη συνάρτηση **δεν μεταβάλλει το αντικείμενο στο οποίο ανήκει**. Η χρήση του προσδιοριστή //const// αποτελεί α) προστασία προς τον προγραμματιστή που υλοποιεί τη μέθοδο, ώστε σε περίπτωση που προσπαθήσει να γράψει ένα πεδίο της κλάσης η μεταγλώττιση να αποτύχει εμφανίζοντας μήνυμα λάθους και β) δήλωση προς τους προγραμματιστές-χρήστες της κλάσης ότι η συγκεκριμένη συνάρτηση δεν θα μεταβάλλει με οποιονδήποτε τρόπο την κατάσταση του αντικειμένου. |
| |
===== Πεδία που περιγράφονται από κλάσεις ===== | ===== Πεδία που περιγράφονται από κλάσεις ===== |
| |
Εκτός από πεδία βασικού τύπου μπορούμε να έχουμε και πεδία κλάσεων των οποίων ο τύπος περιγράφεται από κλάσεις. Παράδειγμα μιας τέτοια κλάσης είναι το κυβοειδές (κλάση Cuboid) το οποίο έχει ένα πεδίο τύπου Rectangle που ορίσαμε παραπάνω. | Εκτός από πεδία βασικού τύπου μπορούμε να έχουμε και πεδία κλάσεων των οποίων ο τύπος περιγράφεται από κλάσεις. Παράδειγμα μιας τέτοια κλάσης είναι το ορθογώνιο παραλληλεπίπεδο - κυβοειδές (κλάση Cuboid) το οποίο έχει ένα πεδίο τύπου Rectangle το οποίο ορίσαμε παραπάνω. |
| |
<code cpp Cuboid.hpp> | <code cpp Cuboid.hpp> |