Как возвратить копию 'только для чтения' вектора

У меня есть класс, который имеет частный вектор атрибута rectVec;

class A {
private:
   vector<Rect> rectVec;
};

Мой вопрос состоит в том, как я могу возвратить копию 'только для чтения' своего Вектора? Я думаю о выполнении этого:

class A {
public:
  const vect<Rect>& getRectVec() { return rectVect; }
}

Это - правильный путь? Я думаю, что это может принять меры против вызываемого, изменяют вектор (добавьте/удалите Rect в векторе), что относительно Rect в векторе?

20
задан Peter Alexander 17 March 2010 в 20:51
поделиться

6 ответов

Это правильный путь, хотя вы, вероятно, также захотите сделать функцию const .

class A {
public:
  const vect<Rect>& getRectVec() const { return rectVect; }                           
};

Это позволяет пользователям вызывать getRectVec , используя объект const A .

28
ответ дан 29 November 2019 в 23:52
поделиться

Это обычный способ. const означает "вы не можете изменить это". Это также относится к элементам внутри контейнера.

Простой тест:

#include <vector>

typedef std::vector<int> int_vec;

struct foo
{
    const int_vec& get(void)
    {
        return v;
    }

    int_vec v;
};

int main(void)
{
    foo f;
    f.v.push_back(1);
    f.v.push_back(2);
    f.v.push_back(3);

    f.get()[0] = 2; // nope
}

const_cast может быть использован для удаления const, но тогда вы получите неопределенное поведение, если измените переменную через него:

int_vec& v = const_cast<int_vec&>(f.get()); // this is okay
v[0] = 0; // but now we've entered undefined behavior
6
ответ дан 29 November 2019 в 23:52
поделиться

Это правильный способ, если пользователь не использует удалите константу с помощью const_cast .

2
ответ дан 29 November 2019 в 23:52
поделиться

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

1
ответ дан 29 November 2019 в 23:52
поделиться

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

.
2
ответ дан 29 November 2019 в 23:52
поделиться

В общем, использование «const &» должно указывать любому программисту на C ++: вы действительно не должны это изменять. Если вы действительно параноик, вам придется клонировать вектор.

0
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: