gpstk空間名パッケージについて
gpstk空間名パッケージについて
最近GPSTKのVectorクラスを見てみると、このクラスがもたらす問題が大きいことがわかりました.これは今度にしましょう名前空間について話しましょう.
amespaceはC++の名前の競合を解決するために導入された.
名前の衝突とは何ですか?たとえば、ファイルx.hにクラスMyClassがあります.
ファイルy.hにはクラスMyClassもありますが、ファイルz.cppでは同時に
x.hファイルとy.hファイルを参照します.明らかに、通常の方法ではできません.
どうすればいいの?namespaceを導入すればよい.例:
名前空間は実質的に役割ドメインである.
上の例で名前空間の役割がわかるでしょう
GPSTKではほとんどがnamespace gpstkの下にカプセル化されています.自分でモジュール関数を書くと、これが災害をもたらすことがわかります.
まず、hppでnamespaceにカプセル化されたオブジェクトを定義する必要がある場合は、次の3つの方法があります.
1. USing namespace gpstkを加える
2. あるいは下のようにクラスをgpstkの下にカプセル化します
3. 従来の方法では、gpstk::Position posなど、gpstkの下のオブジェクトを定義するたびにgpstkで制限されます.
明らかに第三の方法は少ないオブジェクトしか定義できない場合は可能ですが、定義されたオブジェクトが多い場合はあなたも悩んでいるのではないでしょうか~~しかしこれは私が最も安全だと思う方法で、残念ながら効率は高くありません
2つ目の危害は、あなたのcppでgpstkの下のオブジェクト定義変数を使用できないことです.例えば、Position posを定義すると、名前空間gpstkの下のオブジェクトは表示されないため、Postionがまだ宣言されていないことを示します.また、hppで定義されたgpstkの下のオブジェクトを使用しても同じエラーが表示されます.どうすればいいですか.cppの下でusingの空間名が、こんなに複雑で煩雑である以上、直接方法を採用しないわけにはいかない.
方法1は最善の方法かもしれませんが、決してそうではありません.場合によっては崩壊します.tkは良い例です.例えば、次のように自分のコードを書きたいと思っています.いくつかのcmathの関数を使用すると、sin(double)のように一致する定義が見つからないことを示します.tkにはsin()関数が書き換えられており、パラメータのテンプレートタイプが入力されているので、ここでこの書き換えの関数を呼び出して、ここが寒いと思って、C++は本当に頭が痛いですね.処理方法は比較的簡単で、このクラスをgpstkの下にカプセル化しないか、sin()の前にstdを追加します:、具体的にはあなたのニーズを見て、万能な解決策はありません.
最近GPSTKのVectorクラスを見てみると、このクラスがもたらす問題が大きいことがわかりました.これは今度にしましょう名前空間について話しましょう.
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にカプセル化されたオブジェクトを定義する必要がある場合は、次の3つの方法があります.
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::Position posなど、gpstkの下のオブジェクトを定義するたびにgpstkで制限されます.
明らかに第三の方法は少ないオブジェクトしか定義できない場合は可能ですが、定義されたオブジェクトが多い場合はあなたも悩んでいるのではないでしょうか~~しかしこれは私が最も安全だと思う方法で、残念ながら効率は高くありません
2つ目の危害は、あなたのcppでgpstkの下のオブジェクト定義変数を使用できないことです.例えば、Position posを定義すると、名前空間gpstkの下のオブジェクトは表示されないため、Postionがまだ宣言されていないことを示します.また、hppで定義されたgpstkの下のオブジェクトを使用しても同じエラーが表示されます.どうすればいいですか.cppの下でusingの空間名が、こんなに複雑で煩雑である以上、直接方法を採用しないわけにはいかない.
方法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
{
};
}