7

widgetを使用するこの小さなクラスがありstd::stringます。多くの場合、std::vector. ご覧のとおり、型名が非常に長くて煩わしいものになっています。

usingキーワードを利用したい、つまりusing std::string;

問題は、どこに配置するのが最適かということです。

// widget.h file
#ifndef WIDGET
#define WIDGET

// (1)
namespace example {
    // (2)

    namespace nested {
        // (3)

        class widget {  
        public:
            // (4)
            ...
        private:
            // (5)
            std::string name_;
            ...
        };

    }
}

#endif

私の質問は次のとおりです。

  1. 私が(1)それを入れると、含まれているすべての人が自分のスコープを?widget.hで汚染することになります。string
  2. 場所(2)とでは、名前空間とが?を含む 2 番目のファイルで汚染される(3)という点だけが 1. と同じです。exampleexample::nestedwidget.h
  3. 場所(4)(5)では、宣言はかなり分離されていますが、実装 (Cpp) ファイルと継承クラスで表示されますか?

前もって感謝します!

4

1 に答える 1

13

(1)はしないでください。
誰もがあなたの名前を千年呪うでしょう。
あなたのクラスのユーザーとして、私はあなたが自分の名前空間を汚染することを気にしません。しかし、名前空間 (グローバルを含む) のいずれかを汚染すると、コードのコンパイル方法に影響するため、動揺します。「名前空間 std の使用」が悪い習慣と見なされるのはなぜですか?

(4)または(5)では使用できません。

私は(個人的には)使用点のできるだけ近くで(汚染を防ぐために)バインドしたいので。
あなたができる最善のことは(3)です。

しかし、私はそれさえしません。私は標準から何かについて明確です。しかし、コンテナの型を typedef します。

private: //(so at 5) Don't need to expose internal details of your class.
    typedef std::vector<std::string>   MyCont;

これは、変更を 1 か所で行うだけでよく、変更がカスケードされるため、より優れた手法です。

// Sub typedefs now will no longer need to change if you change
// The type of container. Just change the container typedef and
// now the iterators are automatically correct.
public: //(so at 4)  Iterators are public (and not exposing the implementation).
    typedef MyCont::iterator       iterator;
    typedef MyCont::const_iterator const_iterator;
于 2013-03-07T16:33:00.817 に答える