2014-01-08 3 views
-2

Я хочу перегрузить операторы + и = для моего класса матрицы. Мой код:Ошибки при перегрузке + и =

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] 

Для первой ошибки, я прочитал, что он должен быть непосредственно в классе, но даже когда я положил его там, я все еще получаю ошибку. Для второй ошибки я понятия не имею, как это решить. Что я делаю не так?
Спасибо!

+5

Как 'всплывают *' имеет смысл в результате сложения двух матриц? – BartoszKP

+0

Если вы поместите эти функции в класс как члены, вы не сможете объявить их как «друг». Это делает функции нечленов функциями. –

+1

Вы не можете поменять ссылку на 'const'. Вам нужно пройти по значению или сделать локальную копию. – juanchopanza

ответ

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

Я думаю, вы не поняли концепцию друга немного здесь:

Либо использование:

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); 
Смежные вопросы