Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές."— Μεταγράφημα παρουσίασης:

1 Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές είναι σημαντικό να προλαμβάνονται περιπτώσεις χρήσης ενός ήδη χρησιμοποιημένου ονόματος (κλάσης, συνάρτησης, τύπου, template). Η αλλαγή ονομάτων δεν είναι μία αποδοτική πρακτική, ειδικά όταν χρησιμοποιούμε κώδικα που έχουν γράψει άλλοι προγραμματιστές.

2 Αναζήτηση Ονομάτων Ι Η δήλωση του ονόματος μιας μεταβλητής αναζητάται πρώτα στην τοπική εμβέλεια (local scope), ακολούθως στην εμβέλεια κλάσης (class scope) και τέλος στην εμβέλεια αρχείου (file scope). Αν π.χ. μια μεταβλητή x χρησιμοποιείται σε έκφραση, ερευνάται πρώτα η τοπική εμβέλεια. Οι τοπικές εμβέλειες μπορεί να είναι ενσωματωμένες μέσα σε μεγαλύτερα block κώδικα (μεγαλύτερη εμβέλεια) και έτσι η αναζήτηση γίνεται από μέσα προς τα έξω: void X::fun() {... { int x; // αντίστοιχη δήλωση... { x... }

3 Αναζήτηση Ονομάτων ΙΙ Οι παράμετροι συναρτήσεων είναι τοπικές μεταβλητές εξώτερης τοπικής εμβέλειας. void X::fun(int x)// αντίστοιχη δήλωση { x... }

4 Αναζήτηση Ονομάτων ΙΙΙ Αν η μεταβλητή δεν έχει εντοπιστεί σε μία περικλείουσα τοπική εμβέλεια και εμφανίζεται σε συνάρτηση – μέλος μιας κλάσης τότε η δήλωσή της αναζητείται στην εμβέλεια κλάσης. class X {... int x; // αντίστοιχη δήλωση }

5 Αναζήτηση Ονομάτων ΙV Αν μία κλάση Χ κληρονομεί από άλλη ή άλλες κλάσεις τότε γίνεται αναζήτηση σε όλες τις γονεϊκές κλάσεις. class Β {... int x; // αντίστοιχη δήλωση }; class X:public B {... };

6 Αναζήτηση Ονομάτων V Τέλος, αναζητείται ως δήλωση καθολικής μεταβλητής στην εμβέλεια ολόκληρου του αρχείου πηγαίου κώδικα. int x = 0; ή static int x = 0; ή extern int x = 0;

7 Αναζήτηση Ονομάτων VI Ονόματα συναρτήσεων αναζητούνται πρώτα σε εμβέλεια κλάσης. void X::fun() {... f();... } class X {... void f(); //αντίστοιχη συνάρτηση } Αν βρεθεί ένα τέτοιο όνομα τότε η f συμβολίζει συνάρτηση με υπονοούμενο όρισμα self (δηλαδή το αντικείμενο για το οποίο καλείται).

8 Αναζήτηση Ονομάτων VIΙ Στη συνέχεια αναζητάται ο ορισμός ή η πρωτότυπη δήλωση στην εμβέλεια αρχείου. void f() {...}; ή static void f() {...}; ή void f(); // ή extern void f(); // Εξαιτίας της υπερφόρτωσης ονομάτων ο μεταγλωττιστής ψάχνει για όλες τις συναρτήσεις με το ίδιο όνομα και συγκρίνει τις παραμέτρους κλήσης με τους τύπους των ορισμάτων για να επιλέξει τον κατάλληλο ορισμό συνάρτησης.

9 Προσπέλαση μη προκαθορισμένης εμβέλειας I Μπορούμε να υπερβούμε την τοπική εμβέλεια ή την εμβέλεια κλάσης και να αναφερθούμε σε ένα καθολικό όνομα: void Window::message_box(String msg, String title ) { ::message_box(_handle, msg, title, MB_OK) }

10 Προσπέλαση μη προκαθορισμένης εμβέλειας II Μπορούμε να χρησιμοποιήσουμε τον τελεστή εμβέλειας για να επιλέξουμε συγκεκριμένη εμβέλεια. class Manager:public Employee {...}; void Manager::print(ostream &os ) const { Employee::print(os);... }

11 Εμβέλεια και έλεγχος πρόσβασης Στη C++ πρώτα γίνεται αναζήτηση ονόματος και μετά γίνεται ο έλεγχος πρόσβασης (βάση των public, private και protected). void f() {... } class X:public B {... }; class B {... private: void f(); //αντίστοιχο όνομα }; void X::fun() {... f();... }

12 Κλάσεις μέσα σε κλάσεις class List { public: void insert(int); int remove(); //... private: class Link { public: Link(int,Link*=0); int _info; Link* _next; }; Link* _head; };

13 Χρήση κλάσεων για έλεγχο χώρου ονομάτων class Vendor_A { public: class List {... };...}; class Vendor_B { public: class List {... };...}; Επιλύει το πρόβλημα της χρήσης του ίδιου ονόματος List αλλά για να αναφερθούμε θα πρέπει να χρησιμοποιούμε Vendor_A::List

14 Name Spaces I To 1993 ενσωματώθηκε στη C++ ένας μηχανισμός ελέγχου χώρου ονομάτων namespace Vendor_A_Containers { template class List {...}; template class Queue {...};... } αλλά θα πρέπει και οι υλοποιήσεις να περικλείονται στον ίδιο χώρο ονομάτων namespace Vendor_A_Containers { template Τ Queue ::remove() {...}; template int Queue ::length() const {...};... }

15 Name Spaces II Θα πρέπει ο χρήστης των ονομάτων να χρησιμοποιεί τον τελεστή εμβέλειας Vendor_A_Containers::Queue q; ή μπορούμε να κάνουμε alias namespace Cont=Vendor_A_Containers; Vendor_A_Containers::Queue q; ή μπορούμε να προσδιορίσουμε ποια χαρακτηριστικά θα χρησιμοποιήσουμε class Bank { using Vendor_A_Containers::Queue;... private: Queue _waitingQueue;... };

16 Name Spaces III Ο τελεστής using μπορεί να χρησιμοποιηθεί μέσα σε εμβέλεια κλάσης, τοπική εμβέλεια ή εμβέλεια αρχείου. Ή μπορούμε να κάνουμε διαθέσιμα όλα τα ονόματα μέσα στη συγκεκριμένη εμβέλεια: using Vendor_A_MathLib; void f(double mean) { double x = expdist(mean); };


Κατέβασμα ppt "Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google