您的位置:首页 > 其它

关于gpstk空间名封装的问题

2013-11-06 15:37 218 查看

关于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
{
};
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: