使用声明应该有多窄?

时间:2013-03-07 16:14:04

标签: c++ namespaces using

我有一个使用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)(3)中,它与1中的故事相同,只是名称空间exampleexample::nested将在包含{的第二个文件中被污染{1}}?
  3. 在地方widget.h(4)中,声明是完全孤立的,但是它会在实现(Cpp)文件和继承类中显示吗?
  4. 提前致谢!

1 个答案:

答案 0 :(得分:13)

不要在(1)中这样做 每个人都会诅咒你的名字一千年 作为您班级的用户,我不介意您污染自己的名称空间。但是如果你污染我的任何命名空间(包括全局),我会很沮丧,因为这会影响我的代码编译方式。 Why is "using namespace std" considered bad practice?

您不能在(4)或(5)使用它。

因为我(个人)希望尽可能地将其绑定到使用点(以防止污染) 你能做的最好的是(3)。

但我甚至不会这样做。我对标准的任何内容都很明确。但我会输入我的容器类型。

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

这是一种更好的技术,因为您只需要在一个地方进行更改,并且更改将级联。

// 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;