Как изменить данный класс для использования константных операторов - PullRequest
0 голосов
/ 27 ноября 2011

Я пытаюсь решить мой вопрос относительно использования 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 ]

1 голос
/ 27 ноября 2011

Я не совсем понял, что вы пытаетесь сделать, но заметил, что этот код не может быть скомпилирован.Причина в том, что копия обрабатывается копией конструктор , а не оператор .Это означает, что, как и любой конструктор, он ничего не возвращает.Удалите оператор 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];
}
0 голосов
/ 27 ноября 2011

Это вполне нормально - вы создаете оператор, который предоставляет как обычное значение по ссылке, так и постоянное значение по ссылке;

float & operator [] (int i) 
{
    return _item[i];
}

const float & operator [] (int i) const 
{
    return _item[i];
}

Этот шаблон работает как для атомарных типов, таких как float, int и т. Д., Так и для более сложных типов структур и классов.

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