C ++ getter для члена класса векторного типа - PullRequest
2 голосов
/ 18 марта 2020

Если у меня есть vector или другой объект в качестве свойства класса, то как мне реализовать геттер для этого свойства? Должен ли он вернуть сам член или ссылку на него? Пример ниже:

#include "B.h"
#include <vector>

class A {
    vector<int> numbers;
    B obj1;

public:
    vector<int> get_numbers() const;
    // or
    vector<int> & get_numbers() const;

    B get_obj() const;
    // or
    B & get_obj() const;
};

Примечание: Также я не уверен насчет const.

1 Ответ

3 голосов
/ 18 марта 2020
vector<int> & get_numbers() const;

Определенно не это. Вам будет трудно вернуть ссылку на неконстантную ссылку на член из константной квалифицированной функции-члена.

vector<int> get_numbers() const;

Это вариант. Но есть соображения:

  • Невозможно изменить член, используя этот подход. Это хорошо, если вам не нужно изменять их.
  • Это требует, чтобы вы копировали вектор при каждом обращении к получателю. Это может быть потенциально очень дорогой операцией.

Чтобы избежать ненужного копирования, вместо этого вы можете вернуть ссылку на const:

const vector<int> & get_numbers() const;

Чтобы избежать еще более ненужного копирования, разрешив построение перемещения из получателя вы можете использовать набор перегрузок:

const vector<int> &  get_numbers() const & ;
      vector<int> && get_numbers()       &&;

Чтобы разрешить изменение, вы можете использовать неконстантную квалифицированную функцию-член, возвращающую ссылку:

      vector<int> &  get_numbers()       & ;

Другой подход заключается в том, чтобы вообще не использовать геттер. Если пользователю класса нужен доступ к члену, возможно, он должен быть опубликован c.

Вместо этого вы можете предоставить другие формы ограниченного доступа. Путь Idiomati c C ++ состоит в том, чтобы иметь функции-члены begin и end, которые возвращают итераторы. Это позволит изменить содержимое вектора, не изменяя его размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...