У меня есть класс, который имеет частный вектор атрибута rectVec;
class A {
private:
vector<Rect> rectVec;
};
Мой вопрос состоит в том, как я могу возвратить копию 'только для чтения' своего Вектора? Я думаю о выполнении этого:
class A {
public:
const vect<Rect>& getRectVec() { return rectVect; }
}
Это - правильный путь? Я думаю, что это может принять меры против вызываемого, изменяют вектор (добавьте/удалите Rect в векторе), что относительно Rect в векторе?
Это правильный путь, хотя вы, вероятно, также захотите сделать функцию const
.
class A {
public:
const vect<Rect>& getRectVec() const { return rectVect; }
};
Это позволяет пользователям вызывать getRectVec
, используя объект const A
.
Это обычный способ. 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
Это правильный способ, если пользователь не использует удалите константу с помощью const_cast
.
Как насчет того, чтобы вместо того, чтобы возвращать ссылку на ваш вектор, вернуть новый тип, который обертывает вектор (содержит константную ссылку на вектор) и предоставляет только функции, которые вы хотите разрешить вызывающему абоненту. Я предполагаю, что это немного, так как вы хотите предотвратить изменчивость вектора.
в целом это плохая практика. Вы открываете свою внутреннюю реализацию вызывающим вас пользователям. Лучше либо возвращать экземпляр класса-обертки (упоминалось ранее), либо раскрывать функции, которые получают элементы или итераторы (типизированные в соответствии с вашей реализацией)
.В общем, использование «const &» должно указывать любому программисту на C ++: вы действительно не должны это изменять. Если вы действительно параноик, вам придется клонировать вектор.