====== Χώροι Ονομάτων (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;
}