Перегрузка оператора: не удалось вернуть объект через * this - PullRequest
0 голосов
/ 04 августа 2020

Класс «вектор» объявлен следующим образом:

class Vector
{
    private:
        float *arr;
        int currentIndex;
        int arrSize;

    public:
        Vector();
        Vector(int size);
        Vector(const Vector& V);
        ~Vector();
        
        float length();
        Vector normalize();

        Vector operator +(const Vector &v);
        Vector operator =(const Vector &v);
        Vector operator -(const Vector &v);
};

Я определил «operator +» и «operator =», как показано ниже:

Vector  Vector::operator +(const Vector &v)
{
    for (int i = 0; i < arrSize; i++)
    {
        arr[i] += v.arr[i];
    }
    
    return *this;
}
Vector  Vector::operator=(const Vector &v)
{
    if (this != &v)//to avoid case "v = v"
    {
        arrSize = v.arrSize;
        currentIndex = v.currentIndex;
        delete [] arr;
        arr = new float [arrSize];
        for (int i = 0; i < arrSize; i++)
        {
            arr[i] = v.arr[i];
        }
    }

    return *this;
}

main:

//...declared v1, v2 and v3...
v3 = v1 + v2;
cout << v3 << endl;

v3 получают неожиданные значения.

Скажите, пожалуйста, какую часть я реализовал неправильно и как я могу это исправить. Спасибо.

1 Ответ

1 голос
/ 04 августа 2020

Вы пытаетесь реализовать оператор + (), поэтому вы не хотите ничего редактировать в памяти для этого объекта (это будет работа оператора + = ()). Вы бы сделали это:

    Vector Vector::operator+(const& Vector v) //Note it's Vector, not Vector&
    {
        //You probably want to verify that the vectors are the same size?
        assert(arrSize == v.arrSize); //You can do this some other way as well
        
        Vector out = Vector(arrSize); //Create a new object on the heap to return
        for (int i = 0; i < arrSize; i++)
            out.arr[i] = arr[i] + v.arr[i]; //Do the addition
        return out;
    }

И тогда ваш класс operator = () будет выглядеть так:

    Vector& Vector::operator=(const& Vector v) //Note the return type of Vector&
    {
        if (this != &v) //This check is probably superflous
        {
            arrSize = v.arrSize;
            currentIndex = v.currentIndex;
            delete[] arr;
            arr = new float[arrSize];
            for (int i = 0; i < arrSize; i++)
                arr[i] = v.arr[i];
        }
        return *this;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...