c++矩阵class:重载赋值运算符
c++ matrix class: overloading assignment operator
我在为矩阵 class 实现赋值运算符时遇到了一些问题。编译器似乎不想识别我重载的赋值运算符(我想?),我不确定为什么。我知道有一些关于在 C++ 中实现矩阵 classes 的各种问题的互联网文章(这帮助我做到了这一点)但是这次我似乎无法将我当前的困境与任何其他已经出现的帮助相提并论那里。无论如何,如果有人可以帮助解释我做错了什么,我将不胜感激。谢谢!
这是我的错误信息:
In file included from Matrix.cpp:10:
./Matrix.h:20:25: error: no function named 'operator=' with type 'Matrix &(const Matrix &)'
was found in the specified scope
friend Matrix& Matrix::operator=(const Matrix& m);
^
Matrix.cpp:79:17: error: definition of implicitly declared copy assignment operator
Matrix& Matrix::operator=(const Matrix& m){ //m1 = m2
^
Matrix.cpp:89:13: error: expression is not assignable
&p[x][y] = m.Element(x,y);
~~~~~~~~ ^
3 errors generated.
这是我的 .cpp 文件中的赋值运算符代码:
Matrix& Matrix::operator=(const Matrix& m){ //m1 = m2
if (&m == this){
return *this;
}
else if((Matrix::GetSizeX() != m.GetSizeX()) || (Matrix::GetSizeY()) != m.GetSizeY()){
throw "Assignment Error: Matrices must have the same dimensions.";
}
for (int x = 0; x < m.GetSizeX(); x++)
{
for (int y = 0; y < m.GetSizeY(); y++){
&p[x][y] = m.Element(x,y);
}
}
return *this;
这是我的矩阵头文件:
class Matrix
{
public:
Matrix(int sizeX, int sizeY);
Matrix(const Matrix &m);
~Matrix();
int GetSizeX() const { return dx; }
int GetSizeY() const { return dy; }
long &Element(int x, int y) const ; // return reference to an element
void Print() const;
friend std::ostream &operator<<(std::ostream &out, Matrix m);
friend Matrix& Matrix::operator=(const Matrix& m);
long operator()(int i, int j);
friend Matrix operator*(const int factor, Matrix m); //factor*matrix
friend Matrix operator*(Matrix m, const int factor); //matrix*factor
friend Matrix operator*(Matrix m1, Matrix m2); //matrix*matrix
friend Matrix operator+(Matrix m1, Matrix m2);
你的赋值运算符应该是一个成员函数,而不是 friend
。您的其他运算符应将参数作为 const Matrix &
,否则您将复制运算符使用的 Matrix 对象。
您正在获取元素的地址:
&p[x][y] = m.Element(x,y);
当你想分配给它时,像这样:
p[x][y] = m.Element(x,y);
friend Matrix& Matrix::operator=(const Matrix& m);
以上部分毫无意义,因为 operator=
必须定义为 class.
中的成员函数
实际上,我认为如果您在这里不需要朋友(或至少不需要那么多朋友),您的生活会轻松很多。矩阵的自给自足的 public 接口应该允许您实现所有所需的运算符,无论它们是否是 class.
的成员
也许您应该寻求的第一件事是自给自足的 public 接口,这样您实际上就不需要像矩阵乘法运算符这样的东西来成为朋友,否则可能的诱惑是使涉及矩阵的每个操作都需要访问矩阵内部。
我在为矩阵 class 实现赋值运算符时遇到了一些问题。编译器似乎不想识别我重载的赋值运算符(我想?),我不确定为什么。我知道有一些关于在 C++ 中实现矩阵 classes 的各种问题的互联网文章(这帮助我做到了这一点)但是这次我似乎无法将我当前的困境与任何其他已经出现的帮助相提并论那里。无论如何,如果有人可以帮助解释我做错了什么,我将不胜感激。谢谢!
这是我的错误信息:
In file included from Matrix.cpp:10:
./Matrix.h:20:25: error: no function named 'operator=' with type 'Matrix &(const Matrix &)'
was found in the specified scope
friend Matrix& Matrix::operator=(const Matrix& m);
^
Matrix.cpp:79:17: error: definition of implicitly declared copy assignment operator
Matrix& Matrix::operator=(const Matrix& m){ //m1 = m2
^
Matrix.cpp:89:13: error: expression is not assignable
&p[x][y] = m.Element(x,y);
~~~~~~~~ ^
3 errors generated.
这是我的 .cpp 文件中的赋值运算符代码:
Matrix& Matrix::operator=(const Matrix& m){ //m1 = m2
if (&m == this){
return *this;
}
else if((Matrix::GetSizeX() != m.GetSizeX()) || (Matrix::GetSizeY()) != m.GetSizeY()){
throw "Assignment Error: Matrices must have the same dimensions.";
}
for (int x = 0; x < m.GetSizeX(); x++)
{
for (int y = 0; y < m.GetSizeY(); y++){
&p[x][y] = m.Element(x,y);
}
}
return *this;
这是我的矩阵头文件:
class Matrix
{
public:
Matrix(int sizeX, int sizeY);
Matrix(const Matrix &m);
~Matrix();
int GetSizeX() const { return dx; }
int GetSizeY() const { return dy; }
long &Element(int x, int y) const ; // return reference to an element
void Print() const;
friend std::ostream &operator<<(std::ostream &out, Matrix m);
friend Matrix& Matrix::operator=(const Matrix& m);
long operator()(int i, int j);
friend Matrix operator*(const int factor, Matrix m); //factor*matrix
friend Matrix operator*(Matrix m, const int factor); //matrix*factor
friend Matrix operator*(Matrix m1, Matrix m2); //matrix*matrix
friend Matrix operator+(Matrix m1, Matrix m2);
你的赋值运算符应该是一个成员函数,而不是 friend
。您的其他运算符应将参数作为 const Matrix &
,否则您将复制运算符使用的 Matrix 对象。
您正在获取元素的地址:
&p[x][y] = m.Element(x,y);
当你想分配给它时,像这样:
p[x][y] = m.Element(x,y);
friend Matrix& Matrix::operator=(const Matrix& m);
以上部分毫无意义,因为 operator=
必须定义为 class.
实际上,我认为如果您在这里不需要朋友(或至少不需要那么多朋友),您的生活会轻松很多。矩阵的自给自足的 public 接口应该允许您实现所有所需的运算符,无论它们是否是 class.
的成员也许您应该寻求的第一件事是自给自足的 public 接口,这样您实际上就不需要像矩阵乘法运算符这样的东西来成为朋友,否则可能的诱惑是使涉及矩阵的每个操作都需要访问矩阵内部。