I. Giới thiệu về Namespace :
Namespace là 1 đặc trưng của ANSI C++, nó cho phép người lập trình có thể tạo ra 1 scope cho những tên biến toàn cục (global identifier). Và tất nhiên chúng rất hữu dụng trong việc bắt lỗi khi mà 2 hay nhiều khai báo là cùng tên của biến cục bộ.
Ví dụ, giả sử bạn là 1 người lập trình trong 1 cty accounting. Cty của bạn mua 2 thư viện của C++ code từ 1 nhà bán phần mềm. Một thư viện dùng để xử lý các account của khách hàng, cái này dùng để chứa các class object có tên gọi là "payable" chẳng hạn. Và 1 thự viện khác dùng để thiết kế để thao tác các tác vụ như phiếu trả tiền(payrall)...etc, và ngặt 1 cái là cái này cũng có 1 class object có cùng tên "payable". Bạn phải viết 1 chương trình để xài được cả 2 thư viện này, nhưng complier sẽ chắc chắn báo lỗi vì 2 class object này có cùng tên. Trong khi bạn lại không thể chỉnh sữa các thư viện này được vì nhà cung cấp cho bạn không bán cho bạn "source code" chỉ có libary object code( chẳng lẻ tiêu sao^^).
Namespace "superman" xuất hiện, và thế là vấn đề được giải quyết hì hì^^.Namespace sẽ đặt vào mỗi thư viện 1 tên riêng biệt. Với 2 tên riêng biệt này thì nó được dùng để nhận diện các thành viên của nó. Ví dụ, "payable" object là 1 phần của "customer account" thư viện, thì nó có thể có tên là namespace customer, trong khi đó object mà thuộc thư viện paroll thì có tên là namespace payroll.Khi mà chúng ta làm việc với những object, chúng ta phải chỉ rõ ra rằng thành viên nào thuộc namespace nào, chúng ta sẽ dùng scope resolution operator ::. Cái này tương tự y chang như using namespace std của iostream, thì bây h giả sử ta có
PHP Code:
using namespace customer;
Thì khi ta dùng nó ta sẽ dùng như sau ví dụ :
Hơn thế nữa, cái câu lệnh trên sẽ chỉ cho complier nó biết rằng cái soure files mà dùng những thành viên nào của customer namespace.
II.Cách định nghĩa 1 namespace:
PHP Code:
namespace tên;
{
......
}
Ví dụ đơn giản :
PHP Code:
#include <iostream>
using namespace std;
namespace test
{
int x, y;
}
int main()
{
test::x = 10;
test::y = 20;
cout << "x : " << test::x << endl;
cout << "y : " << test::y << endl;
return 0;
}
Output
Code:
x : 10
y : 20
Press any key to continue . . .
Bây h ví dụ này sẽ cho thấy vấn đề trùng tên mà ta đã đề cập ở trên .
PHP Code:
#include <iostream>
using namespace std;
namespace test1
{
int x;
}
namespace test2
{
int x;
}
int main()
{
test1::x = 10;
test2::x = 20;
cout << "x : " << test1::x << endl;
cout << "y : " << test2::x << endl;
return 0;
}
Output
Code:
x : 10
y : 20
Press any key to continue . . .
III.Ví dụ khác và cách dùng using với namespace:
nsdemo.h
PHP Code:
namespace demo
{
class NsDemo
{
public:
int x, y, z;
};
NsDemo testObject;
}
main.cpp
PHP Code:
#include <iostream>
#include "nsdemo.h"
using namespace std;
using namespace demo;
int main()
{
testObject.x = 10;
testObject.y = 20;
testObject.z = 30;
cout << "The values are:\n"
<< testObject.x << " "
<< testObject.y << " "
<< testObject.z << endl;
return 0;
}
Dùng using namespace demo; thì ta không cần phải dùng cái toán tử resolution scope nữa (demo:
vì complier nó sẽ tự động dựa vào cái tên demo mà nó tìm đúng tên biến của nó.