Реализация матричного класса в 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;
}
}