1

そのため、名前空間が宣言をそれぞれのグループに整理するのにいかに役立つかを見てきましたが、これには問題があります。

C でライブラリを作成する場合と C++ でライブラリを作成する場合の違いは、C では、宣言の前に宣言が属するもののプレフィックスを付ける必要があることです。

C++ では、Vector クラスがその一部として宣言された名前空間 MyMath を使用します。

ここでの違いは C にあります。クラス宣言に移動するだけで、その使用方法がすぐにわかります。C++ では、特定のクラスが属する名前空間を確認する必要があります (実際には、宣言が名前空間宣言の近くにないファイルでのみ問題が発生します。これは、定数と列挙が 2 つの間で宣言されている場合に一般的です)。私は組織化のために名前空間を使用することを好みますが、私の意見では、これは煩わしさとして依然として有効な議論です。

この煩わしさを軽減するために人々は何をしましたか?

4

5 に答える 5

2

簡単なヒントとシンボル ナビゲーションを提供する IDE を使用するか、ドキュメント ジェネレーター (Doxygen など) を使用します。

于 2009-12-01T18:08:06.477 に答える
2

彼の著書の第 8 章で、Stroustrup は次のようなスタイルを推奨しています。

MyMath.h

namespace MyMath {
  class Vector;
};

ベクトル.h

#include "MyMath.h"

class MyMath::Vector {
  public:
  Vector();
  // ...
};

ベクトル.cc

#include "Vector.h"

MyMath::Vector::Vector() { /* ... */ }

開いている名前空間宣言をその内容の宣言に限定すると、簡単な要約が生成されます。完全に修飾された定義により、コンパイラはタイプミスをキャッチできます。

あなたの懸念に当てはまるように、このスタイルのクラス宣言と定義は、各クラスの親名前空間を明確にしますが、Go の人々が stutteringと呼ぶものを犠牲にしています。

于 2009-12-01T18:40:38.483 に答える
2

「宣言が名前空間宣言の近くにないファイルでのみ問題が発生します。これは、2 つの間に定数と列挙が宣言されている場合に一般的です。」

それが気になる場合は、次のようにします。

namespace MyMath {
    constants and enumerations go here
}

namespace MyMath {
    class goes here
}

namespace MyMath {
    another class goes here
}

クラスとは異なり、名前空間をまとめて定義する必要はありません。角かっこは「これがすべて」という意味ではなく、すべての定義がその名前空間にあり、すべてのシンボルが名前空間で検索されるスコープを示しているだけです。

于 2009-12-01T18:38:17.467 に答える
0

問題はないはずです。usingヘッダーにステートメントが含まれていないこと、およびモノリシックなソース ファイルがないことを確認してください。それが大きな問題である場合は、クラスを完全に修飾してください。

于 2009-12-01T18:12:35.193 に答える
0

あなたが説明する問題は、あなたの考え方に要約されます。コードを開発するとき、あなたは を使用していることをよく知っているので、混乱をできるだけ少なくし、 or節MyMath::Vectorを追加することに興味があります。using namespace MyMath;using MyMath::Vector;

数か月後、誰かがあなたのコードに飛び込み、名前空間がどの名前空間から来ているのかわかりません。Vector彼は、(あなたがしたように) このusing宣言によってコードがわかりにくくなると主張するかもしれません。

ここで優れた IDE の出番です。名前空間 (大規模なシステムの場合、実際には非常に大きくなる可能性があります) を残すことができますが、コードをデバッグ/編集するときに、IDE はシンボルが宣言され、定義された場所を完全に示唆することができます。 、参照など...

于 2009-12-01T18:21:46.660 に答える