1. ホーム
  2. c++

C++の名前空間に関するアドバイス

2023-08-19 19:35:15

質問

私はちょうど C++ の名前空間を独学しているところです (C# のバックグラウンドから来ました)。そして、C++ が他のほとんどの言語よりも優れているすべての事柄について、入れ子の名前空間はそれらのうちの 1 つではない、と本当に思い始めています!

ネストされた名前空間を宣言するために、次のことをしなければならないと考えていて正しいでしょうか。

namespace tier1
{
    namespace tier2
    {
        namespace tier3
        {
            /* then start your normal code nesting */
        }
    }
}

とは対照的です。

namespace tier1::tier2::tier3
{
}

à la C#?

これはforward宣言が必要なときにさらに頭が悪くなりますね。

namespace tier1
{
    namespace tier2
    {
        namespace forward_declared_namespace
        {
            myType myVar; // forward declare
        }
        namespace tier3
        {
            /* then start your normal code nesting */
            class myClass
            {
                forward_declared_namespace::myType myMember;
            }
        }
    }
}

私が開発する典型的なシステムは、以下のように構成されていることを念頭に置いてください。

MyCompany::MySolution::MyProject::System::[PossibleSections]::Type

C++の例で名前空間があまり使われていないのはこのためでしょうか?あるいは、通常は単一の (ネストされていない) 名前空間のみですか?

アップデイト

ご興味のある方はどうぞ。 はこのようになりました。 に取り組むことになりました。

どのように解決したのですか?

C++ の名前空間は設計メカニズムとして意図されたものではなく、単に名前の衝突を防ぐために存在するものです。99.99% の状況では、ネストされた名前空間を使用したくない、または使用する必要はありません。

C++ における名前空間の正しい使い方の良い例は、C++ 標準ライブラリです。この非常に大きなライブラリ内のすべてのものは、と呼ばれる単一の名前空間に配置されています。 std - このライブラリを(例えば)I/O サブネーム空間、数学サブネーム空間、コンテナサブネーム空間などに分割する試みや必要性はありません。

C++でモデリングするための基本的なツールはクラス(とある程度テンプレート)であり、名前空間ではありません。ネストの必要性を感じるのであれば、ネストされたクラスの使用を検討すべきであり、それは名前空間よりも以下の利点があります。

  • メソッドを持つ
  • アクセスを制御することができる
  • 再オープンできない

これらを考慮した上で、もしまだネストされた名前空間を使いたいのであれば、ぜひそうしてください。