У меня простой вопрос. У меня есть класс, который говорит A с частным членом, который является контейнером stl, например вектором ints. Есть ли способ использовать его методы (например, размер, размер и т.д.)? Достаточно ли классического "получить функцию"?
Class A
{
private:
std::vector<int> v;
public:
std::vector<int> get_v() {return v;};
};
Если да, это не "функция получения", предназначенная только для того, чтобы получить член и не изменять член?
большое спасибо
Нормальная вещь здесь - вернуть постоянную ссылку на элемент данных:
const std::vector<int>& get_v() const
{
return v;
}
Обратите внимание, что я также сделал функцию постоянной. Это говорит о том, что функция не будет изменять какие-либо члены данных в классе.
В настоящее время вы берете глубокую копию вектора, который является дорогостоящим с точки зрения производительности, а также отделяет вас от исходных данных.
Если вы хотите вызвать методы, такие как resize
(изменение вектора), вы также можете указать non- постоянную версию функции (перегрузка в const
) разрешена в C++):
std::vector<int>& get_v()
{
return v;
}
Компилятор вызовет версию const
если у вас есть указатель const
(или ссылка) на экземпляр A
Иначе, если вы вызовете версию non- const
.
Этот getter вернет копию внутреннего вектора. Любые внесенные изменения повлияют только на копию. Это может быть хорошо, если вы также предоставляете сеттер, чтобы измененная копия могла быть передана обратно, чтобы вы могли сделать что-то вроде этого:
A a;
std::vector<int> v = a.get_v();
v.push_back(5);
a.set_v(v);
Кроме того, вы можете заставить getter вернуть ссылку на внутренний вектор (поэтому его тип возврата будет std::vector<int>&
, после чего вы можете изменить его извне.
Метод get возвращает копию элемента данных. Таким образом, такой метод не позволяет изменять исходный вектор,
Если вы хотите обеспечить доступ к элементам вектора, вы можете либо перегрузить оператор [], либо написать метод get с параметром.
Например
Class A
{
private:
std::vector<int> v;
public:
int operator []( std::vector<int>::size_type n ) const { return v[n]; }
int & operator []( std::vector<int>::size_type n ) { return v[n]; }
};
или вы можете написать методы get, которые делают то же самое
Class A
{
private:
std::vector<int> v;
public:
int get( std::vector<int>::size_type n ) const { return v[n]; }
int & get( std::vector<int>::size_type n ) { return v[n]; }
};
Что касается идеи использовать копию вектора или ссылку на него, чтобы получить его размер, то это не очень хорошая идея. Лучше предоставить метод, который возвращает размер вектора. В этом случае пользовательский интерфейс не будет зависеть от типа контейнера.
const
а возвращаемое значение - как ссылку наconst
.