使用命名空间解决名字冲突
2013-12-14 10:56
351 查看
命名空间时间上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分割开来。
在程序设计中,难免会有一个页面包含多个其他页面的情况。当包含不同的页面是,不同的页面就有可能出现同名的类或者变量等,但显然他们在不同的页面中的作用是不同的,当包含到同一个页面的时候,就会出现重复定义的错误。这种情况可以使用命名空间来结果:
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是两个不同的类,不会发生冲突。
在程序设计中,难免会有一个页面包含多个其他页面的情况。当包含不同的页面是,不同的页面就有可能出现同名的类或者变量等,但显然他们在不同的页面中的作用是不同的,当包含到同一个页面的时候,就会出现重复定义的错误。这种情况可以使用命名空间来结果:
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是两个不同的类,不会发生冲突。
相关文章推荐
- 使用命名空间解决名字冲突
- 使用命名空间解决名字冲突
- 如何解决“xxxxxx是“命名空间”,但此处被当做“类型”来使用”的问题
- Spring + MyBatis + Ehcache 整合 CacheManager 版本>2.5,命名空间冲突 解决
- dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法
- 「命名空间内部使用的名字的查找」与「类成员定义中使用的名字的查找」的区别
- dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法
- 解决ambiguous symbol命名空间中类名、变量名冲突的问题
- 使用用户控件时,网站运行没有问题,但生成网站时却出错:命名空间“ASP”中不存在类型或命名空间名称“ascx_ub_weightbar_ascx” 的解决方法
- 名字空间解决数据库冲突问题
- TGridDrawState名字空间冲突问题及解决方法(E2015 Ambiguity between 'TGridDrawState' and 'Gridseh::TGridDrawState')
- 关于包含头文件而编译时却一个未定义错误的原因(未使用命名名字空间)
- Javascript 命名空间解决命名冲突问题
- 运用名字空间解决数据库冲突问题
- PHP使用Memcache时模拟命名空间及缓存失效问题的解决
- 解决<fx:Style>样式设置中报错 必须使用命名空间限定 CSS 选择器“Alert”中的类型“Alert”
- 转: dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法
- spring中使用mvc和tx命名空间的冲突
- error C2872: “flann”: 不明确的符号 --- PCL 与OpenCV2 的flann命名空间冲突问题的解决方法
- 解决办法:Flex4使用Efflex_v0.03.swc (Fx4/FP10),在该命名空间中多次定义了组件 MotionPath……