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

Я пытаюсь решить мой вопрос об использовании push_back более чем на одном уровне. Из комментариев / ответов ясно, что я должен:

  1. Создайте оператор копирования, который принимает аргумент const
  2. Изменить все мои операторы, чтобы 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.

Другие вопросы по тегам