Если ваш класс уже использует std::vector<A*>
в своей реализации, то добавление typedef std::vector<A*>::size_type size_type
не раскрывает больше деталей, чем это уже есть.
Однако, если вы собираетесь использовать полную инкапсуляцию, вам понадобится методика, такая как PIMPL idom или класс интерфейса (также известный как класс протокола), полностью скрывающий, что std::vector<A*>
вообще используется в реализации:
До:
#include <vector>
class A;
class Foo {
public:
typedef std::vector<A*>::size_type size_type;
size_type get_number_of_stuff() const;
private:
std::vector<A*> _stuff;
};
После (с использованием техники PIMPL):
class FooImpl;
class Foo {
public:
typedef size_t size_type; // or just use size_t directly below
size_type get_number_of_stuff() const;
private:
FooImpl* _impl;
};
FooImpl определяется в вашем исходном файле, а не в заголовке, полностью скрывая выбор вектора в деталях реализации. Поэтому вам больше не нужно #include <vector>
в заголовочном файле, что имеет пару преимуществ:
- Пользователи вашего заголовочного файла не обязаны (косвенно) включать вектор, если они его не используют. Это может улучшить производительность во время компиляции, что важно для больших баз кода.
- Если вы измените реализацию (например, в список), вы не рискуете нарушить любой код, который (ошибочно) полагался на ваш
#include <vector>
, который теперь #include <list>
. Это случается.