关于gpstk空间名封装的问题

9 篇文章 8 订阅

关于gpstk空间名封装的问题

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

amespace是为了解决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
   {
   };
}
 
 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值