Как мне индексировать закрытый вектор вне класса?

Предполагая ситуацию, когда у меня есть:

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
};

Какие еще варианты у меня есть?

1

Решение

Вы также можете использовать 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, но вы также можете предоставить сеттер, который позволяет пользователям заменять элемент вашего вектора.

1

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

Используйте то, что лучше всего подходит для дизайна вашего класса. Тот факт, что ваш класс использует std::vector внутренне не имеет значения; интерфейсы класса не должны управляться деталями реализации. Любые корректировки, будь то значения или типы, могут быть сделаны внутри твой класс. Так что используйте std::size_t, unsignedили что угодно.

1

size_type тип статического члена типа std::vector<X>

И это typedef для std::size_t, который сам обычно является typedef для unsigned int или же unsigned long long

Так можно использовать std::vector<X>::size_type или просто std::size_t для индексации.

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