Как получить доступ к методам контейнера, когда контейнер находится в классе как закрытый член?

0

У меня простой вопрос. У меня есть класс, который говорит A с частным членом, который является контейнером stl, например вектором ints. Есть ли способ использовать его методы (например, размер, размер и т.д.)? Достаточно ли классического "получить функцию"?

Class A
{
private:
    std::vector<int> v;
public:
    std::vector<int> get_v() {return v;};
};

Если да, это не "функция получения", предназначенная только для того, чтобы получить член и не изменять член?

большое спасибо

  • 0
    По сути, вы просто объявляете функцию как const а возвращаемое значение - как ссылку на const .
  • 0
    Я, кажется, интерпретировал ваш вопрос по-другому для других. Ваш последний вопрос подразумевает, что вы хотите изменить участника? Или ты этого не хочешь?
Показать ещё 1 комментарий
Теги:
containers

3 ответа

3
Лучший ответ

Нормальная вещь здесь - вернуть постоянную ссылку на элемент данных:

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.

  • 0
    Хотя, если вы собираетесь предоставить функцию для прямого доступа к ней, вы также можете отказаться от притязаний на инкапсуляцию и сделать ее общедоступной.
0

Этот getter вернет копию внутреннего вектора. Любые внесенные изменения повлияют только на копию. Это может быть хорошо, если вы также предоставляете сеттер, чтобы измененная копия могла быть передана обратно, чтобы вы могли сделать что-то вроде этого:

A a;
std::vector<int> v = a.get_v();
v.push_back(5);
a.set_v(v);

Кроме того, вы можете заставить getter вернуть ссылку на внутренний вектор (поэтому его тип возврата будет std::vector<int>&, после чего вы можете изменить его извне.

0

Метод 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]; }
};

Что касается идеи использовать копию вектора или ссылку на него, чтобы получить его размер, то это не очень хорошая идея. Лучше предоставить метод, который возвращает размер вектора. В этом случае пользовательский интерфейс не будет зависеть от типа контейнера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню