最近遇到个重命名的问题,顺便把namespace复习了下,特此记下防止以后遗忘!!!
namespace命名空间,良好的使用这个关键字可以防止在大型工程中的多文件中的函数名,类名冲突等因名字相同引发的问题,现在举个简单的例子:
- #ifndef T1_H
-
#define T1_H
-
-
#include <stdio.h>
-
-
namespace classA
-
{
-
class A
-
{
-
public:
-
A();
-
~A();
-
void test();
-
};
-
-
void haha();
-
}
-
-
namespace classB
-
{
-
class A
-
{
-
public:
-
A();
-
~A();
-
void test();
-
};
-
void haha();
-
}
-
#endif
这个头文件中定义了两个类名相同的文件,和两个同名的函数,如果没有给他们定义指定的命名空间的话,当然会编译不过了!
包含了命名空间后如何定义他们呢?
- #include "t1.h"
-
namespace classA
-
{
-
A::A()
-
{
-
;
-
}
-
-
A::~A()
-
{
-
;
-
}
-
-
void A::test()
-
{
-
printf("A\n");
-
}
-
-
void haha()
-
{
-
printf("A haha\n");
-
}
-
}
-
namespace classB
-
{
-
A::A()
-
{
-
;
-
}
-
-
A::~A()
-
{
-
;
-
}
-
-
void A::test()
-
{
-
printf("B\n");
-
}
-
-
void haha()
-
{
-
printf("B haha\n");
-
}
-
}
使用他们的方法如下:
- #include "t1.h"
-
//using namespace classA; //如果这两个类相同的名字不会在同一文件中构造,就不用在构造类对象前加名称空间域,只要加这句就会默认构造classA域中的类A对象,同理其他同名的函数接口或其他的
-
//using namespace classB;
-
int main()
-
{
-
classA::A a;
-
classB::A b;
-
a.test();
-
b.test();
-
classA::haha();
-
classB::haha();
-
return 0;
-
}
如果在构造两个类A对象时不用域名的话,程序编译会报
main.cpp:6: error: reference to ‘A’ is ambiguous
t1.h:22: error: candidates are: class classB::A
t1.h:9: error: class classA::A
main.cpp:6: error: reference to ‘A’ is ambiguous
t1.h:22: error: candidates are: class classB::A
t1.h:9: error: class classA::A
这种混乱的对象错误
阅读(3650) | 评论(0) | 转发(0) |