У меня есть этот маленький класс widget
который использует std::string
, Он использует его во многих местах, часто в сочетании с std::vector
, Таким образом, вы можете видеть, что typenames становятся очень длинными и раздражающими.
Я хочу использовать 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
будет загрязнен во втором файле, который включает в себя widget.h
?(4)
а также (5)
, объявление довольно изолированно, но будет ли оно видно в файле реализации (Cpp) и в наследующих классах?Заранее спасибо!
Не делайте этого в (1).
Каждый будет проклинать твое имя на тысячу лет.
Как пользователь вашего класса, я не против того, чтобы вы загрязняли свое собственное пространство имен. Но я буду расстроен, если вы загрязните любое из моих пространств имен (включая глобальное), так как это повлияет на компиляцию моего кода. Почему "используя пространство имен std" считается плохой практикой?
Вы не можете использовать его в (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;
Других решений пока нет …