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