我想为我的矩阵类重载运算符+和=。我的代码是:
friend float* operator+(const Matrix& m)
{
for(int i = 0; i < (int)(m._n*m._n); i++)
_m[i] = _m[i] + m._m[i];
};
friend Matrix& operator=(const Matrix& m)
{
std::swap(_m, m._m);
return *this;
};
_m
数据和_n
平方矩阵的大小。但是我的编译器给了我以下错误:
main.cpp:161:45: error: ‘Matrix& operator=(const Matrix&)’ must be a nonstatic member function
main.cpp: In function ‘float* operator+(const Matrix&)’:
main.cpp:192:12: error: invalid use of non-static data member ‘Matrix::_m’
main.cpp:158:13: error: from this location
main.cpp:192:12: error: invalid use of non-static data member ‘Matrix::_m’
main.cpp:158:21: error: from this location
main.cpp:159:5: warning: no return statement in function returning non-void [-Wreturn-type]
对于第一个错误,我已经读过它必须直接在类中,但即使我把它放在那里,我仍然得到错误。对于第二个错误,我不知道如何解决这个问题。我做错了什么?
谢谢!
答案 0 :(得分:5)
如果你在一个类中定义了friend
,那么不是一个成员函数,但是可以在一个类中定义一个独立的函数(字面意思)便利性。
所以operator=()
当然不应该是friend
,而是简单的成员const Matrix& operator=(Matrix m)
或const Matrix& operator=(const Matrix& m)
。顺便说一句,如果参数为std::swap()
,则无法使用const Matrix& m
。您必须遵循copy-and-swap idiom。
对于operator+()
,您应该选择:
friend Matrix operator+(const Matrix& m1, const Matrix& m2)
Matrix operator+(const Matrix& m1) const
。答案 1 :(得分:1)
我认为你在这里误解了朋友的概念:
使用:
friend Matrix operator+(const Matrix& lhs,const Matrix& rhs);
在课堂内定义外面的自由功能。 (你想如何返回一个浮点*我不知道,所以我的实现返回一个矩阵) 然后你必须像这样访问你的成员变量:
{
Matrix result; //insert correct constructor here.
for(int i = 0; i < (int)(lhs._n*rhs._n); i++)
result._m[i] = lhs._m[i] + rhs._m[i];
};
或者你选择会员运营商+这样
Matrix operator+(const Matrix& rhs) const;
然后,this
,rhs
与您的返回值之间的访问权限之间只有不同,而且由于您要返回副本,因此可以保持其正确。
请记住,朋友的功能没有this
,因此无法直接访问成员变量。
对于赋值运算符,您不能使用友元重载,这是因为编译器已经存在默认赋值运算符。
所以你必须在课堂上提供:
Matrix& operator=(const Matrix& a);