Я читал, что скрытие фактического типа контейнера, используемого в классе, - это хорошо. Это делает случайным (или преднамеренно) написание кода, который соответствует фактическому типу контейнера (который может меняться и прерывать предыдущий код), и, следовательно, код более надежный.Скрытие реализации контейнера STL от пользователей класса
Таким образом, это означает, что это не очень хорошая идея; Если изменения реализации от std::vector
до std::list
вещей сломаются:
class MyType {
public:
const std::vector<MyType*>& GetChildren() const;
std::vector<MyType*>& GetChildren();
const std::vector<MyType*>::size_type GetChildCount() const;
std::vector<MyType*>::size_type GetChildCount();
private:
MyType* _parent;
std::vector<MyType*> _children;
};
Использования typedef
делает выглядеть как она скрыта, но пользователю нужно всего лишь взглянуть на определении мыши над (по крайней мере, в Visual Studio), чтобы увидеть фактический тип и код соответственно. Хуже того, компилятор вообще не видит typedef
, он просто видит базовый тип.
class MyType {
public:
typedef std::vector<MyType*> ChildContainer;
typedef ChildContainer::size_type ChildContainerSize;
const ChildContainer& GetChildren() const;
ChildContainer& GetChildren();
const ChildContainerSize GetChildCount() const;
ChildContainerSize GetChildCount();
private:
MyType* _parent;
ChildContainer _children;
};
Вопрос: Есть ли способ, чтобы скрыть базовый тип контейнера, так что это будет трудно для пользователя код вокруг него короткое оберточной контейнер STL в потенциально плохо написано и не-необходимой обертке ?
Вы имеете в виду, как скрыть базовый контейнер? Как насчет итераторов? – 4pie0
Вместо предоставления методам getter 'GetChildren()' предоставляет свои собственные операции для добавления/обновления/удаления и повторения элементов _child_. –
См. [Эту статью о стирании типа *] (http://www.artima.com/cppsource/type_erasure.html). – juanchopanza