使用命名空间解决名字冲突
命名空间时间上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分割开来。
在程序设计中,难免会有一个页面包含多个其他页面的情况。当包含不同的页面是,不同的页面就有可能出现同名的类或者变量等,但显然他们在不同的页面中的作用是不同的,当包含到同一个页面的时候,就会出现重复定义的错误。这种情况可以使用命名空间来结果:
demo:
header1.h
#include<cstring> #include<cmath> using namespace std; namespace ns1 //声明命名空间1 { class Student { public: Student(int n,string nam,int a) { num=n; name=nam; age=a; } void get_data(); private: int num; string name; int age; }; void Student::get_data() //在类外定义函数体 { cout<<num<<" "<<name<<" "<<age<<endl; } double fun(double a,double b) { return sqrt(a+b); } }
header2.h
#include<cstring> #include<cmath> using namespace std; namespace ns2 { class Student { public: Student(int n,string nam,string s) { num=n; name=nam; sex=s; } void get_data(); private: int num; string name; string sex; }; void Student::get_data() { cout<<num<<" "<<name<<" "<<sex<<endl; } double fun(double a,double b) { return sqrt(a-b); } }
main.cpp
#include<iostream> #include"header1.h" #include"header2.h" using namespace std; int main() { ns1::Student stud1(101,"Wang",18); stud1.get_data(); cout<<ns1::fun(3,5)<<endl; cout<<"\n=====================孤单寂寞冷的分割线飞过=============================="<<endl; ns2::Student stud2(102,"li","f"); stud2.get_data(); cout<<ns2::fun(5,3)<<endl; return 0; }
输出结果:
/* 101 Wang 18 2.82843 =====================孤单寂寞冷的分割线飞过=========================== 102 li f 1.41421 */
分析:分别在header1.h和header2.h中建立了两个命名空间ns1和ns2,将原来在两个头文件中声明的类分别放在命名空间ns1个ns2中。注意:在头文件中,不要把#include命令放在命名空间中,因为命名空间中的内容不包括命令行,否则编译会出错。
两个Student和fun分别放在不同的命名空间中,各自有其作用域,互不相干。由于作用域不相同,不会产生名字冲突。正如同在两个不同的类中可以有同名的变量和函数而不会产生冲突一样。在使用时,我们只需要在用ns1::Student(命名空间ns1中的Student)来定义stud1,用ns2::Student(命名空间ns2中的Student)来定义stud2。显然,ns1::Student和ns2::Student是两个不同的类,不会发生冲突。