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)(3)中,它与 1 中的故事相同。只是命名空间exampleexample::nested将在第二个文件中被污染,其中包括widget.h
  3. 在 place(4)(5)中,声明是相当孤立的,但它会在实现(Cpp)文件和继承类中可见吗?

提前致谢!

4

1 回答 1

13

不要在(1)中这样做。
每个人都会诅咒你的名字一千年。
作为您班级的用户,我不介意您污染自己的命名空间。但是如果你污染了我的任何命名空间(包括全局命名空间),我会感到不安,因为这会影响我的代码的编译方式。为什么“使用命名空间标准”被认为是不好的做法?

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

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

但我什至不会那样做。我对标准中的任何事情都很明确。但我会 typedef 我的容器类型。

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;
于 2013-03-07T16:33:00.817 回答