重载+和=时出错

时间:2014-01-08 14:17:23

标签: c++ overloading

我想为我的矩阵类重载运算符+和=。我的代码是:

    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]

对于第一个错误,我已经读过它必须直接在类中,但即使我把它放在那里,我仍然得到错误。对于第二个错误,我不知道如何解决这个问题。我做错了什么?
谢谢!

2 个答案:

答案 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;

然后,thisrhs与您的返回值之间的访问权限之间只有不同,而且由于您要返回副本,因此可以保持其正确。

请记住,朋友的功能没有this,因此无法直接访问成员变量。

对于赋值运算符,您不能使用友元重载,这是因为编译器已经存在默认赋值运算符。

所以你必须在课堂上提供:

Matrix& operator=(const Matrix& a);