Реализация матричного класса в C++ с использованием конструктора перемещения

Я пытаюсь сделать матричный класс в C++.(Я знаю, что есть тонны лучших библиотек, но прежде чем использовать их, я хочу реализовать простой класс.) Это то, что я хочу реализовать: matrix4 = matrix1 + matrix2 + matrix3 Поэтому я сделал ниже код.

Проблема в этом. Когда программа рассчитать matrix1 + matrix2вызывает конструктор перемещения. Потому что результат matrix1 + matrix2 является временным объектом, нет необходимости создавать другой объект. Тем не менее, потому что operator + создать временный объект при каждом вызове, (matrix1 + matrix2) + matrix3 создание другого временного объекта, который приводит к утечке памяти.

Как я должен решить это?

(Извините, если это трудно понять. Я новичок здесь, и английский не мой родной язык)

РЕДАКТИРОВАТЬ: Ну, в то же время я нашел решение, которое является шаблоны выражений. В любом случае спасибо за помощь. (В этой статье я пропустил большую часть кода, потому что он полон моих пользовательских функций. Я обязательно решу эту проблему в следующий раз.)

template <typename CT>
class Matrix
{
    CT** m_ppArray;
    int m_nRow;
    int m_nColumn;

    template <typename CT>
    Matrix<CT>::Matrix(const Matrix<CT>& rMatrix)
        : m_nRow(rMatrix.m_nRow)
        , m_nColumn(rMatrix.m_nColumn)
    {
        //Allocate m_ppArray and copy rMatrix.m_ppArray into it.
    }

    template<typename CT>
    Matrix<CT>::Matrix(Matrix<CT>&& rrMatrix)
    {
        m_ppArray = rrMatrix.m_ppArray;
        rrMatrix.m_ppArray = 0x0;
        m_nRow = rrMatrix.m_nRow;
        m_nColumn = rrMatrix.m_nColumn;
    }

    const Matrix<CT>& operator =(const Matrix& rMatrix)
    {
        if (this != &rMatrix)
        {
            //Reallocate and copy
        }

        return *this;
    }
    const Matrix<CT>& operator =(const Matrix&& rrMatrix)
    {
        if (this != &rrMatrix)
        {
            //delete current array
            m_nRow = rrMatrix.m_nRow;
            m_nColumn = rrMatrix.m_nColumn;
            m_ppArray = rrMatrix.m_ppArray;
        }

        return *this;
    }

    Matrix<CT> operator +(const Matrix& rMatrix) const
    {
        Matrix mTemp(m_nRow, m_nColumn);

        for (int k = 0; k < m_nRow; k++)
        {
            for (int l = 0; l < m_nColumn; l++)
            {
                mTemp.m_ppArray[k][l] = m_ppArray[k][l] + rMatrix.m_ppArray[k][l];
            }
        }

        return mTemp;
    }
}

0 ответов

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