0

私は、次のような名前空間の使用法に精通しています。

ヘッダファイル(例えばpeople.h)には、名前空間のインターフェースを記述します。例えば:

namespace people{
   int getAge(str Name);
   void setName(str Name);
}

次にpeople.cpp、スペース名からメソッドを定義します。

#include "people.h"
int people::getAge(str Name) {
   something_1;
   something_2;
}

void people::setName(str Name) {
   something_1;
}

ただし、私が持っているヘッダー ファイルには、 に加えて、namespace people他の名前空間のインターフェイスもあることがわかります (たとえば、namespace dogs)。そして、これらの名前空間はpeople.cppファイルで定義されていません。

そこで、(何らかの奇妙な理由により) のインターフェイスnamespace dogsが に配置されpeople.h、名前空間の dog が「dogs.cpp」ファイルで定義されていると想定しました。つまり、2 つの異なる名前空間が 2 つの異なる cpp ファイルで定義されていると仮定しましたが、それらのインターフェイスは 1 つのヘッダー ファイルに記述されています。しかし、「名前空間の犬」を宣言するヘッダー ファイルが多数あることがわかったため、この仮定は間違っているようです。

したがって、namespace dogs2people.h" ファイルには別の関数があると思いますが、それがどの関数なのかわかりません。誰か助けてもらえますか?

追加した

私が理解しようとしているコードは、私が書いたものではなく、正常に動作します。だから、それは理にかなっているはずです。私は十分に明確ではなかったかもしれません。だから、私は例を挙げようとします:

ヘッダー ファイル ( people.h) には次のものがあります。

namespace etet
{
    class date;
}

namespace xsystem{
    class estimation_module;
}

namespace people {
   a_lot_of_different_stuff;
}

次に、people.cpppeople 名前空間に属するすべてのメソッドを定義します。

4

2 に答える 2

2

名前空間とクラスを混同しています。通常、クラス定義はヘッダー ファイル ( .h) に記述され、そのメンバー関数の実装は対応する実装ファイル ( .cpp) に記述されます。

名前空間は、class. aclassが複数の翻訳単位で定義されている場合、それらすべてに正確に同じトークンが含まれている必要があります。まったく同じクラスになる場合でも、メンバーを並べ替えることはできません。上記のヘッダー ファイルを使用すると、この要件を簡単に満たすことができます。クラスを必要とする各翻訳単位には、必要なときに必要なためfoo、の内容が含まれています。もちろん、それらはすべて含まれているため、すべて正確に同じ定義を 含んでいます。foo.h#include "foo.h"foofoo.h

ただし、これは名前空間とは大きく異なります。名前空間は、毎回同じトークンになることなく、同じ翻訳単位と異なる翻訳単位で複数回導入できます。このようなものはまったく問題ありません:

namespace bar {
  void baz();
  struct x;
}
// some stuff
namespace bar {
  void do_something(x);
}

が出現するたびnamespace barに、その名前空間にいくつかの宣言が導入されます。

多くの場合、同じ名前空間に多くのクラスが定義されています。これらのクラスの各ヘッダーは、namespace whatever { ... }その名前空間にクラス定義を導入します。

場合によっては、1 つのヘッダー ファイルで複数の名前空間またはネストされた名前空間に何かを導入したいことさえあります。あなたがそれをするのを止めるものは何もありません。これを行う可能性のある状況は、別の名前空間から何かを宣言する場合です。people.h次のように定義されたクラスがあるとします。

namespace people {
  class person {
    dogs::dog* pet_dog;
  };
}

ここで、これは名前空間classの型について知る必要がdogあります。dogs彼を行う1つの方法は、#include "dogs.h". ただし、pet_dogはポインターにすぎないため、不完全な型を使用できるため、次のように前方宣言できますdog

namespace dogs {
  class dog;
}

namespace people {
  class person {
    dogs::dog* pet_dog;
  };
}
于 2013-02-26T13:48:12.900 に答える
2

「名前空間インターフェース」は誤解を招く概念です。名前空間は、姓の下にグループ化された名前の束です (あなたとあなたの兄弟姉妹のように)。名前空間「obejct 」がないため、「インターフェース」はありません。

#include "people.h"
int people::getAge(str Name) {
   something_1;
   something_2;
}

void people::setName(str Name) {
   something_1;
}

と完全に同等です

#include "people.h"
namespace people
{
  int getAge(str Name) {
     something_1;
     something_2;
  }

  void setName(str Name) {
     something_1;
  }
}

これはよりなじみがあるかもしれませんし、そうでないかもしれません。ヘッダーが cpp に存在しない関数を宣言しているという事実は、それらがおそらく別の cpp に存在することを意味します。

namespace name { ..... }宣言が多くのファイルで繰り返される可能性があるという事実については、namespaceキーワードはオブジェクトを宣言しないため、それぞれにさまざまな関数が含まれていることは完全に正常です。グループ名だけです。実際、名前空間が「宣言されている」と言うのは、よくある言葉の乱用です。宣言されているのは名前空間の名前です。

また、異なる場所で宣言された異なる名前は、同じグループに属することができます。そこには不思議なことは何もありません。

namespaceあなたの辞書は、あなたがs とclasses とstructsを混同していると私に思わせます

追加した:

a_lot_of_different_stuff明確にした後、を使用する宣言が含まれているようetet::dateに見えますxsystem::estimation_module;

この名前 (および名前のみ) はコンパイラーに認識されている必要がありますが、ヘッダーにはそれぞれのヘッダーが既に含まれている可能性が高いため、再帰的に含めることはできませんpeople.h

hereのような典型的な「curculare reference」の問題ですが、異なる名前空間が関係しています。

于 2013-02-26T13:48:47.417 に答える