关于gpstk空间名封装的问题
2013-11-06 15:37
218 查看
关于gpstk空间名封装的问题
最近看了下GPSTK中的Vector类,发现这个类带来的问题很大。这个下次再说吧先说说命名空间,namespace是为了解决C++中的名字冲突而引入的。
什么是名字冲突呢?比如,在文件x.h中有个类MyClass,
在文件y.h中也有个类MyClass,而在文件z.cpp中要同时
引用x.h和y.h文件。显然,按通常的方法是行不能的,
那怎么办呢?引入namespace即可。例如:
// x.h namespace MyNamespace1 { class MyClass { public: void f(); private: int m; } }; // 在y.h中的内容为 // y.h namespace MyNamespace2 { class MyClass { public: void f(); private: int m; } }; // 然后在z.cpp中引入x.h和y.h // z.cpp #include"x.h" #include"y.h" void z::f() { //声明一个文件x.h中类MyClass的实例x MyNamespace1::MyClass x; //声明一个文件x.h中类MyClass的实例x MyNamespace2::MyClass y; //调用文件x.h中的函数f x.f(); //调用文件y.h中的函数f y.f(); }
名字空间实质上是一个作用域。
通过上面的一个实例应该知道名字空间的作用了吧
在GPSTK中大部分都是封装在 namespace gpstk下面的,如果你自己写模块函数就会发现这个给你带来一些灾难
首先如果你在hpp中需要定义封装在namespace下的对象,那么可以采用三种方式:
1. 加上using namespace gpstk
#include <cmath> #include <stdio.h> #include "Position" using namespace std; using namespace gpstk; calss X { };
2. 或者像下面的把类封装在gpstk下面
#include <cmath> #include <stdio.h> #include "Position" using namespace std; namespace gpstk; { calss X { }; }
3. 老办法,在每次定义 gpstk 下的对象时候用 gpstk 限制起来 ,例如gpstk::Position pos
显然第三中方法在只定义少量对象时是可以的,可是定义的对象多了的时候你恐怕也很苦恼吧~~不过这个是我认为最安全的方式,可惜效率不高
第二个的危害就是在你的cpp中不能使用gpstk下的对象定义变量 例如定义 Position pos会提示Postion尚未声明,因为命名空间gpstk下的对象对于其是不可见的,此外使用hpp中定义的gpstk下的对象也会报同样的错误,怎么办,在cpp下using下空间名,既然这么复杂繁琐 ,何不直接采用方法1呢~~
好了方法1可能是最好的方法了,绝不是,在有些情况下你会崩溃,tk就是很好的例子,例如想下面这样写自己的代码,当你使用某些cmath的函数时候例如sin(double)会提示找不到匹配的定义,因为tk中重写了sin()函数,其输入参数模版类型,而这里就会调用这个重写的函数,想到这儿就寒,C++真是头疼啊。处理方法比较简单将该类不封装在gpstk下面,或者是在sin()前面加上
std:: ,具体的看你的需要,没有万能的解决方案
#include <cmath> #include <stdio.h> #include "Position" using namespace std; using namespace gpstk; namespace gpstk { calss X { }; }
相关文章推荐
- 关于free如何知道要释放内存空间的长度问题(X86篇)
- 关于栈空间和堆空间的问题
- 关于C++中posix pthread线程函数在类中封装的问题
- 关于unity打开非自己原创工程时出现命名空间不存在等错误问题
- 关于cloudstack的Dashboard的显示存储空间容量的问题
- 关于Oracle中不能扩展Undo表空间的问题
- 关于sql server数据库主文件大小与空间问题(因为 'PRIMARY' 文件组已满)
- 关于DB2表空间高水位线居高不下的问题解决
- 关于C++的一个栈空间被占用问题的总结
- 关于rm删除文件空间不释放的问题
- 关于php接口中命名空间报错问题:
- 关于结构体中变量空间占用问题思考
- unity3d 关于c#命名空间引用问题
- 关于free如何知道要释放内存空间的长度问题
- 解决关于页面空间disable之后服务器端取值问题
- 一个关于封装、继承、多态的问题
- 关于空间定位的问题
- 关于无缝空间数据库若干问题的探讨
- 关于Javascript模块化和命名空间管理的问题说明
- UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题