Насколько узким должно быть объявление об использовании?

У меня есть этот маленький класс 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. Если я помещу это в (1) тогда все, кто включает widget.h будет загрязнена их сфера string?
  2. В местах (2) а также (3)это та же история, что и в 1. только то, что пространства имен example а также example::nested будет загрязнен во втором файле, который включает в себя widget.h?
  3. В местах (4) а также (5), объявление довольно изолированно, но будет ли оно видно в файле реализации (Cpp) и в наследующих классах?

Заранее спасибо!

7

Решение

Не делайте этого в (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;
13

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]