2

Barという名前空間でクラスが呼び出されると仮定するとfoo、ソース (.cpp/.cc) ファイルにはどの構文を使用しますか?

namespace foo {
...
void Bar::SomeMethod()
{
    ...
}

} // foo

また

void foo::Bar::SomeMethod()
{
    ...
}

私は名前空間を頻繁に使用し、最初の構文を好みますが、Visual Studio クラス ウィザード (WM_COMMAND ハンドラーなど) を使用してコードを追加すると、自動生成されたコードは 2 番目の構文を使用します。ある構文が他の構文よりも優れている点はありますか?

4

4 に答える 4

6

私は最初のものを辞退します(編集:質問が変更されました。最初のものは私も今好むものです)。関数定義だけを見ていると Bar がどこを指しているのかはっきりしないので。また、最初の方法では、滑りやすいエラーが表示される可能性があります。

namespace bar { 
     struct foo { void f(); };
}

namespace baz { 
    struct foo { void f(); };
}

using namespace bar;
using namespace baz;

void foo::f() { // which foo??

}

現在のスコープ (グローバル スコープ) を検索するため、2 つの foo が検出され、それへの参照があいまいであることがわかります。

個人的には、次のようにします。

namespace foo {
void Bar::SomeMethod() {
    // something in here
}
}

また、SomeMethod の定義を見ただけでは、それがどの名前空間に属しているかは明確ではありませんが、その周りに名前空間スコープがあり、簡単に調べることができます。さらに、Bar が名前空間 foo を参照していることは明らかです。

あなたが示す2番目の方法は、実際には私にとってタイピングが多すぎるでしょう. さらに、2 番目の方法は、コードの新しい読者の間で混乱を招く可能性があります: foo はクラスで、Bar はそのネストされたクラスですか? それとも foo は名前空間で、Bar はクラスですか?

于 2008-11-18T20:55:11.877 に答える
5

リストされていないオプションを好む:

namespace foo {

void Bar::SomeMethod()
{
    ...
}

}  // foo namespace

オプション 1 とは異なり、これにより、コードが単に foo 名前空間を使用しているだけでなく、そこに属していることが明らかになります。オプション 2 とは異なり、多くの入力を節約できます。ウィンウィン。

于 2008-11-18T20:55:48.540 に答える
2

名前空間が明示的にマークされている最初のケースに行きたいと思います。

namespace TheNamespace {
void TheClass::TheMethod() {
   // code
}
}

その理由は、その構文から、TheClass がクラスであり、TheNamespace が名前空間であることが明らかだからです (他の名前では明らかではありません)。コードが

void TheNamespace::TheClass::TheMethod() {
   // code
}

その場合、読者は、TheNamespace が名前空間なのか、それとも TheClass という名前の内部クラスを持つクラスなのかを明確に認識できません。

class TheClass1
{
   class TheClass2
   {
      void TheMethod();
   }
};

void TheClass1::TheClass2::TheMethod() {
   // code
}

私は「using」ステートメントを避ける傾向がありますが、それでも、2 つの異なる名前空間にある 2 つのクラスを持つ litb による例は、コンパイラとプログラマの両方を混乱させるので、避けるべきです。

于 2008-11-18T22:25:20.870 に答える
1

それぞれの場合によると思います。それが独自のコードに似たサード パーティのライブラリであり、コード内での混乱を避けたい場合は、出現ごとに完全な名前空間を指定すると効果的です。しかし、それ以外は、コードが少ないほど一般的に優れています (不明確にならない限り)。

于 2008-11-18T20:54:55.280 に答える