| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
cpp:namespace [2017/04/11 14:01] gthanos |
cpp:namespace [2017/04/12 07:09] gthanos |
| ====== Namespaces ====== | ====== Χώροι Ονομάτων (Namespaces) ====== |
| |
| Προκειμένου να αποφεύγονται οι συγκρούσεις ονομάτων μεταξύ //global// μεταβλητών, κλάσεων ή συνάρτησεων η C++ ορίζει την έννοια του χώρου ονομάτων (//namespace//). Ένα //namespace// δίνει την δυνατότητα να ορίσουμε μεταβλητές, κλάσεις και μεθόδους σε ένα συγκεκριμένο χώρο ονομάτων. Η ύπαρξη πολλών //namespaces// δίνει την δυνατότητα να ορίσουμε δύο ή περισσότερες μεταβλητές, κλάσεις ή συναρτήσεις με το ίδιο όνομα που ανήκουν όμως σε διαφορετικούς χώρους ονομάτων. | Προκειμένου να αποφεύγονται οι συγκρούσεις ονομάτων μεταξύ //global// μεταβλητών, κλάσεων ή συνάρτησεων η C++ ορίζει την έννοια του χώρου ονομάτων (//namespace//). Ένας χώρος ονομάτων δίνει την δυνατότητα να ορίσουμε μεταβλητές, κλάσεις και μεθόδους μοναδικές μόνο για το συγκεκριμένο χώρο ονομάτων. Άλλοι χώροι ονομάτων μπορεί να περιέχουν μεταβλητές, κλάσεις ή μεθόδους με τα ίδια ονόματα. Η ύπαρξη περισσότερων του ενός χώρων ονομάτων δίνει την δυνατότητα να ορίσουμε δύο ή περισσότερες μεταβλητές, κλάσεις ή συναρτήσεις με το ίδιο όνομα σε διαφορετικούς χώρους ονομάτων. |
| |
| Ένα //namespace// ορίζεται ως εξής: | Ένα //namespace// ορίζεται ως εξής: |
| } | } |
| </code> | </code> |
| | |
| Για παράδειγμα | Για παράδειγμα |
| <code c++> | <code c++> |
| namespace constants { | namespace constants { |
| const double var = 1.6180339887; | const double golderRatio = 1.6180339887; |
| double value() { return var; } | double gRatio() { return golderRatio; } |
| } | } |
| </code> | </code> |
| | |
| | ===== Προσπέλαση των στοιχείων του namespace ===== |
| |
| Η προσπέλαση/χρήση των περιεχομένων ενός namespace μπορεί να γίνει με τρεις τρόπους. | Η προσπέλαση/χρήση των περιεχομένων ενός namespace μπορεί να γίνει με τρεις τρόπους. |
| |
| === Δηλώνοντας το namespace σε κάθε κλήση των περιεχομένων του με την βοήθεια του τελεστή ''::'' === | === Δηλώνοντας το namespace σε κάθε κλήση των περιεχομένων του με την βοήθεια του τελεστή :: === |
| | |
| | <WRAP center round tip 80%> |
| | Ο τελεστής ''::'' ονομάζεται //scope operator//. |
| | </WRAP> |
| |
| <code c++ namespace.cpp> | <code c++ namespace.cpp> |
| </code> | </code> |
| |
| === με μία δήλωση ονομάτων που θα χρησιμοποιηθούν από ένα namespace === | === Mε δήλωση μόνο των ονομάτων που θα χρησιμοποιηθούν === |
| | |
| | Χρησιμοποιούμε την έκφραση ''using namespace_name::var_name'', όπως παρακάτω: |
| <code c++ namespace.cpp> | <code c++ namespace.cpp> |
| #include <iostream> | #include <iostream> |
| } | } |
| |
| using namespace constants:gRatio; | using constants::gRatio; |
| |
| int main() { | int main() { |
| </code> | </code> |
| |
| === με μία δήλωση των namespaces που θα χρησιμοποιηθούν === | === Με δήλωση του namespace από το οποίο θα χρησιμοποιηθούν συγκεκριμένα ονόματα === |
| | |
| | Χρησιμοποιούμε την έκφραση ''using namespace namespace_name'', όπως παρακάτω: |
| <code c++ namespace.cpp> | <code c++ namespace.cpp> |
| #include <iostream> | #include <iostream> |
| </code> | </code> |
| |
| Δείτε τα σχετικά παραδείγματα που ακολουθούν. | === Παράδειγμα ορισμού και χρήσης μεταβλητών και μεθόδων με το ίδιο όνομα από δύο διαφορετικά namespaces === |
| |
| Παρακάτω δίνεται ένα παράδειγμα, όπου ορίζονται δύο διαφορετικά //namespaces// τα οποία όμως έχουν μία μεταβλητή και μία συνάρτηση με το ίδιο όνομα. Δείτε πως | Στο παράδειγμα που ακολουθεί ορίζονται δύο //namespaces// τα οποία περιέχουν μία μεταβλητή και μία συνάρτηση με το ίδιο όνομα. Δείτε πως διακρίνουμε τις επιμέρους μεταβλητές με χρήση του ονόματος του αντίστοιχου //namespace// πριν από την χρήση κάθε μεταβλητής ή συνάρτησης. |
| |
| <code c++ nameVisibility.cpp> | <code c++ nameVisibility.cpp> |