Как изменить данный класс для использования константных операторов
Я пытаюсь решить мой вопрос об использовании push_back более чем на одном уровне. Из комментариев / ответов ясно, что я должен:
- Создайте оператор копирования, который принимает аргумент const
- Изменить все мои операторы, чтобы const
Но так как этот заголовочный файл мне дан, есть оператор, который я не могу преобразовать в const. Это просто:
float & operator [] (int i) {
return _item[i];
}
В данной программе этот оператор используется для получения и установки данных.
Моя проблема в том, что из-за того, что мне нужен этот оператор в заголовочном файле, я не могу превратить все остальные операторы в const, что означает, что я не могу вставить оператор копирования.
Как я могу превратить все мои операторы в const, сохраняя при этом функциональность уже написанной программы?
Вот полное объявление класса:
class Vector3f {
float _item[3];
public:
float & operator [] (int i) {
return _item[i];
}
Vector3f(float x, float y, float z)
{ _item[0] = x ; _item[1] = y ; _item[2] = z; };
Vector3f() {};
Vector3f & operator = ( const Vector3f& obj)
{
_item[0] = obj[0];
_item[1] = obj[1];
_item[2] = obj[2];
return *this;
};
Vector3f & operator += ( const Vector3f & obj)
{
_item[0] += obj[0];
_item[1] += obj[1];
_item[2] += obj[2];
return *this;
};
bool operator ==( const Vector3f & obj) {
bool x = (_item[0] == obj[0]) && (_item[1] == obj[1]) && (_item[2] == obj[2]);
return x;
}
// my copy operator
Vector3f(const Vector3f& obj) {
_item[0] += obj[0];
_item[1] += obj[1];
_item[2] += obj[2];
return this;
}
};
2 ответа
Я не совсем понял, что вы пытаетесь сделать, но заметил, что этот код не может быть скомпилирован. Причина в том, что копия обрабатывается конструктором копирования, а не оператором. Это означает, что, как и любой конструктор, он ничего не возвращает. Удалить return
утверждение от вашего конструктора, вот так:
Vector3f(const Vector3f& obj) {
_item[0] += obj[0];
_item[1] += obj[1];
_item[2] += obj[2];
}
Как сделать ваш оператор const
Вы можете просто перегрузить его и предложить две версии одного и того же метода. Первый будет не const
и вернет ссылку (допускает изменения), а вторая будет const
и вернуть копию (в идеале вы должны вернуть const
ссылка, но так как float
s являются примитивными типами, просто возвращаются по значению).
float & operator [] (int i)
{
return _item[i];
}
float operator [] (int i) const
{
return _item[i];
}
Это вполне нормально - вы создаете оператор, который предоставляет как обычное значение по ссылке, так и постоянное значение по ссылке;
float & operator [] (int i)
{
return _item[i];
}
const float & operator [] (int i) const
{
return _item[i];
}
Этот шаблон работает как для атомарных типов, таких как float, int и т. Д., Так и для более сложных типов struct и class.