Предполагая ситуацию, когда у меня есть:
class A {
private:
std::vector<X> _v;
// ...
public:
A();
// ...
};
и предполагая, что мне нужно ограничить доступ к векторным элементам для редактирования и / или чтения. Какой тип индексации (int
, long
, std::size_t
пользовательский итератор или другие) я должен использовать, чтобы указать элемент в векторе за пределами класса А?
Правильно ли следующее индексирование?
class A {
// ...
X getVectorElement(std::size_t);
void editSomeElementValue(std::size_t, double); // double is the type of the value to edit
};
Какие еще варианты у меня есть?
Вы также можете использовать size_type
для индекса — тот же тип, что и ваш вектор:
// Make your own type for the index based on the vector's index type
typedef std::vector<X>::size_type size_type;
// Use your typedef in the declaration of your getter
X getVectorElement(size_type index);
Возвращение копии — это хорошая идея — на самом деле, это лучшее, что нужно сделать, если вы хотите спрятать вектор от своих абонентов. Возврат указателя или ссылки может быть более производительным, но он открывает ваш класс для бэкдор-манипуляций, в случаях, когда X
изменчиво Это также создает проблему, если вектор изменяется после возврата ссылки, поскольку изменение вектора делает недействительными ссылки на его элементы.
Вы можете предоставить отдельные функции для управления атрибутами X
, но вы также можете предоставить сеттер, который позволяет пользователям заменять элемент вашего вектора.
Используйте то, что лучше всего подходит для дизайна вашего класса. Тот факт, что ваш класс использует std::vector
внутренне не имеет значения; интерфейсы класса не должны управляться деталями реализации. Любые корректировки, будь то значения или типы, могут быть сделаны внутри твой класс. Так что используйте std::size_t
, unsigned
или что угодно.
size_type
тип статического члена типа std::vector<X>
И это typedef для std::size_t
, который сам обычно является typedef для unsigned int
или же unsigned long long
Так можно использовать std::vector<X>::size_type
или просто std::size_t
для индексации.