关于gpstk空间名封装的问题

来源:互联网 发布:税务师考试含金量 知乎 编辑:程序博客网 时间:2024/06/06 09:21

关于gpstk空间名封装的问题

         最近看了下GPSTK中的Vector类,发现这个类带来的问题很大。这个下次再说吧先说说命名空间,n

amespace是为了解决C++中的名字冲突而引入的。

什么是名字冲突呢?比如,在文件x.h中有个类MyClass,

在文件y.h中也有个类MyClass,而在文件z.cpp中要同时

引用x.h和y.h文件。显然,按通常的方法是行不能的,

那怎么办呢?引入namespace即可。例如:

      
// x.hnamespace MyNamespace1{   class MyClass   {   public:      void f();   private:      int m;   }};// 在y.h中的内容为// y.hnamespace 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   {   };}







原创粉丝点击