К сожалению, OP не предоставил MCVE .
Следовательно, я копирую / вставляю части кода OP, которые были ИМХО в порядке (а не причина сообщенной проблемы)и сделал все остальное сам.
Вот образец, который я подготовил:
#include <iostream>
class matrixType3 {
private:
int matrix[3][3];
public:
matrixType3(): matrix{ 0 } { }
matrixType3(int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8, int x9):
matrix{ { x1, x4, x7 }, { x2, x5, x8 }, { x3, x6, x9 } }
{ }
~matrixType3() = default;
matrixType3(const matrixType3&) = default;
#if 0 // OP's version:
matrixType3 operator=(const matrixType3&mat) const
{
std::cout << "matrixType3 matrixType3::operator=(const matrixType3 &mat)()\n";
matrixType3 tempMatrix;
for (int i = 0; i < 3; i++) {
for (int r = 0; r < 3; r++) {
tempMatrix.matrix[i][r] = mat.matrix[i][r];
}
}
return tempMatrix;
}
#else // My version:
/* This would be actually sufficient:
matrixType3& operator=(const matrixType3&) = default;
* but for demonstration a custom implementation:
*/
matrixType3& operator=(const matrixType3 &mat)
{
std::cout << "matrixType3& operator=(const matrixType3 &mat)()\n";
std::copy(
std::begin(mat.matrix[0]), std::end(mat.matrix[0]),
std::begin(matrix[0]));
std::copy(
std::begin(mat.matrix[1]), std::end(mat.matrix[1]),
std::begin(matrix[1]));
std::copy(
std::begin(mat.matrix[2]), std::end(mat.matrix[2]),
std::begin(matrix[2]));
return *this;
}
#endif // 0
// copy/pasted from OP:
matrixType3 operator+(const matrixType3& mat) const
{
matrixType3 tempMatrix;
for (int i = 0; i < 3; i++) {
for (int r = 0; r < 3; r++) {
tempMatrix.matrix[i][r] = mat.matrix[i][r] + matrix[i][r];
}
}
return tempMatrix;
}
/* a "getter" to provide read-only access to the member variable
*
* (Returning a const reference to a 2d array makes this function
*a bit strange looking...) ;-)
*/
const int (&get() const)[3][3] { return matrix; }
};
ОП заявил, что
Однако моя проблема в том, что операторФункции перегрузки не работают.
Я твердо верю, что именно OP operator=()
является проблемой, когда другие операторы выглядят не так уж плохо.Подпись, выбранная ОП для operator=
, выглядит для меня очень необычно.Вместо этого должно быть:
matrixType3& operator=(const matrixType3 &mat)
Оператор должен присвоить аргумент mat
самому себе (то есть *this
).Следовательно, он не может быть const
и не должен возвращать ссылку const
.(Последнее, вероятно, сработало бы, но без необходимости ограничивало бы применимость возвращаемого значения.)
Чтобы доказать, что я на правильном пути, я скопировал / вставил OP operator=()
в мой пример кода и точно увидел, какой OPописано.
Кстати.Я поместил оператор вывода в оператор присваивания, чтобы показать, когда он вызывается.
Чтобы проверить приведенный выше код, остальная часть примера:
std::ostream& operator << (std::ostream &out, const matrixType3 &mat)
{
const int (&values)[3][3] = mat.get();
return out
<< values[0][0] << '\t' << values[0][1] << '\t' << values[0][2] << '\n'
<< values[1][0] << '\t' << values[1][1] << '\t' << values[1][2] << '\n'
<< values[2][0] << '\t' << values[2][1] << '\t' << values[2][2] << '\n';
}
int main()
{
matrixType3 mat1(11, 21, 31, 12, 22, 32, 13, 23, 33);
std::cout << "mat1:\n" << mat1;
matrixType3 mat2;
std::cout << "mat2:\n" << mat2;
std::cout << "mat2 = mat1;\n";
mat2 = mat1;
std::cout << "mat2:\n" << mat2;
std::cout << "mat1 + mat2:\n" << mat1 + mat2;
matrixType3 mat3;
mat3 = mat1 + mat2;
std::cout << "mat3 = mat1 + mat2:\n" << mat3;
// This is no assigment:
std::cout << "No assignment: matrixType3 mat4 = mat1;\n";
matrixType3 mat4 = mat1;
std::cout << "... but initialization/copy construction\n";
std::cout << "mat4:\n" << mat4;
return 0;
}
Скомпилировано и протестировано (с моим operator=()
):
mat1:
11 12 13
21 22 23
31 32 33
mat2:
0 0 0
0 0 0
0 0 0
mat2 = mat1;
matrixType3& operator=(const matrixType3 &mat)()
mat2:
11 12 13
21 22 23
31 32 33
mat1 + mat2:
22 24 26
42 44 46
62 64 66
matrixType3& operator=(const matrixType3 &mat)()
mat3 = mat1 + mat2:
22 24 26
42 44 46
62 64 66
No assignment: matrixType3 mat4 = mat1;
... but initialization/copy construction
mat4:
11 12 13
21 22 23
31 32 33
Демонстрация в реальном времени на coliru
При подготовке образца кода я споткнулся:
matrixType3 mat1;
matrixType3 mat2; mat2 = mat1;
против
matrixType3 mat1;
matrixType3 mat2 = mat1;
, которые я также счел нужным уточнить.
Хотя оба образца выглядят очень похожими, есть большая разница:1 st использует назначение копирования, но в 2 nd =
компилируется как инициализация (потому что следует непосредственно за объявлением).Следовательно, в случае 2 и нет никакой помощи.(Вместо этого вызывается конструктор копирования.)