Векторные значения не сохраняются постоянно [C ++ Rookie]

0

Я перезаписал оператор +:

Matrix& Matrix::operator+(Matrix m1)
{
    //This should never be triggered
    if(this->data.capacity() != m1.data.capacity() || this->data[0].capacity() != m1.data[0].capacity())
    {
        cout << "Dimensions don't match, can't add.\n";
        throw 7;
    }
    vector<vector<double>> result;
    result.resize(m1.data.capacity());
    for(int i = 0; i < m1.data.size(); i++)
    {
        result[i].resize(m1.data[0].size());
        for(int j = 0; j < m1.data[0].size(); j++)
        {
            result[i][j] = m1.data[i][j] + this->data[i][j];
        }
    }
    return Matrix(m1.getRows(),m1.getCols(), result);
}

Это соответствующий конструктор:

Matrix::Matrix(int rows, int cols, vector<vector<double>> data)
{
    this->rows = rows;
    this->cols = cols;
    this->data = data;
}

Здесь исполняемый код:

c = (a+b);

Когда я назначаю точку останова на последней строке перегрузки оператора, я могу видеть правильные результаты в result и оба столбца и строки назначаются правильно. Когда я выхожу, c имеет "строки" и "cols", которые установлены правильно, но данные пустые. Почему это?

  • 0
    Посмотрите этот ответ о том, почему вы не должны возвращать ссылку или указатель на локальную переменную функции.
  • 0
    Вы возвращаете ссылку на локальный объект функции. Это никогда не хорошая вещь, чтобы сделать.
Показать ещё 1 комментарий
Теги:
operator-keyword
memory-management

1 ответ

5
Лучший ответ

Ваш оператор + ошибочен. Он должен возвращать новый объект, а не ссылку на локальный объект (который в любом случае является UB).

  • 0
    О Боже, да, очевидно. Это помогло, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню