====== Χώροι Ονομάτων (Namespaces) ====== Προκειμένου να αποφεύγονται οι συγκρούσεις ονομάτων μεταξύ //global// μεταβλητών, κλάσεων ή συνάρτησεων η C++ ορίζει την έννοια του χώρου ονομάτων (//namespace//). Ένας χώρος ονομάτων δίνει την δυνατότητα να ορίσουμε μεταβλητές, κλάσεις και μεθόδους μοναδικές μόνο για το συγκεκριμένο χώρο ονομάτων. Διαφορετικοί χώροι ονομάτων μπορεί να περιέχουν μεταβλητές, κλάσεις ή μεθόδους με τα ίδια ονόματα. Ένα //namespace// ορίζεται ως εξής: namespace identifier { named_entities } Για παράδειγμα namespace constants { const double golderRatio = 1.6180339887; double gRatio() { return golderRatio; } } ===== Προσπέλαση των στοιχείων του namespace ===== Η προσπέλαση/χρήση των περιεχομένων ενός namespace μπορεί να γίνει με τους παρακάτω τρεις τρόπους! ==== Δηλώνοντας το namespace σε κάθε κλήση των περιεχομένων του με την βοήθεια του τελεστή :: ==== Ο τελεστής ''::'' ονομάζεται //scope operator//. #include using namespace std; namespace constants { const double golderRatio = 1.6180339887; double gRatio() { return golderRatio; } } int main() { cout << "Golden Ratio: " << constants::golderRatio << endl; cout << "Golden Ratio: " << constants::gRatio() << endl; } ==== Mε δήλωση μόνο των ονομάτων που θα χρησιμοποιηθούν ==== Χρησιμοποιούμε την έκφραση ''using namespace_name::var_name'', όπως παρακάτω: #include using namespace std; namespace constants { const double golderRatio = 1.6180339887; double gRatio() { return golderRatio; } } using constants::gRatio; int main() { cout << "Golden Ratio: " << constants::golderRatio << endl; cout << "Golden Ratio: " << gRatio() << endl; } ==== Με δήλωση του namespace από το οποίο θα χρησιμοποιηθούν συγκεκριμένα ονόματα ==== Χρησιμοποιούμε την έκφραση ''using namespace namespace_name'', όπως παρακάτω: #include using namespace std; namespace constants { const double golderRatio = 1.6180339887; double gRatio() { return golderRatio; } } using namespace constants; int main() { cout << "Golden Ratio: " << golderRatio << endl; cout << "Golden Ratio: " << gRatio() << endl; } ===== Παράδειγμα ορισμού και χρήσης μεταβλητών και μεθόδων με το ίδιο όνομα από δύο διαφορετικά namespaces ===== Στο παράδειγμα που ακολουθεί ορίζονται δύο //namespaces// τα οποία περιέχουν μία μεταβλητή και μία συνάρτηση με κοινό όνομα. Παρατηρήστε πως διακρίνουμε τις επιμέρους μεταβλητές με χρήση του ονόματος του αντίστοιχου //namespace// πριν από την χρήση κάθε μεταβλητής ή συνάρτησης. #include using namespace std; namespace euler { const double var = 2.71828; double value() { return var; } } namespace pi { const double var = 3.1416; double value() { return var; } } int main () { cout << pi::var << '\n'; cout << pi::value() << '\n'; cout << euler::var << '\n'; cout << euler::value() << '\n'; return 0; }