#c #operator-overloading
#c #перегрузка оператора
Вопрос:
Я работаю над назначением, которое знакомит меня с перегрузкой оператора. Мне приходится перегружать некоторые двоичные операторы как функции-члены, а также как дружественные функции. Моя функция-член, которая перегружает оператор » «, работает нормально, но моя функция friend, которая перегружает оператор «-«, похоже, испытывает проблемы с поиском данных, которые может использовать функция-член.
класс def:
class matrix
{
friend ostreamamp; operator << (ostreamamp;, const matrixamp;);
friend bool operator == (const matrix amp;, const matrix amp;);
friend matrix operator - (const matrix amp;, const matrix amp;);
private:
int size;
int range;
int array[10][10];
public:
matrix(int);
matrix(int, int);
bool operator != (const matrix amp;) const;
matrix operator (const matrix amp;) const;
const matrix amp; operator = (const matrix amp;);
};
перегрузка » «:
matrix matrix::operator (const matrix amp; a) const
{
matrix temp(size,range);
for (int i = 0; i < a.size; i )
for (int j = 0; j < a.size; j )
temp.array[i][j] = a.array[i][j] array[i][j];
return temp;
}
«-» перегрузка:
matrix operator - (const matrix amp; a, const matrix amp; b)
{
matrix temp(size, range);
for (int i = 0; i < a.size; i )
for (int j = 0; j < a.size; j )
temp.array[i][j] = a.array[i][j] - array[i][j];
return temp;
}
Ошибка, которую я получаю в функции friend, заключается в том, что размер, диапазон и массив не объявлены. Я в замешательстве, потому что я думал, что функции member и friend имеют равный доступ к данным в классе, и я в основном делаю одно и то же в обеих функциях. Кто-нибудь знает, в чем может заключаться моя проблема?
Комментарии:
1. Можете ли вы также добавить свои объявления?
2. имеют ли обе функции доступ к объявлениям класса ‘matrix’?
3. Добавлено определение класса. данные инициализируются в конструкторе: matrix(a,b)
Ответ №1:
Оператор friend не является частью класса. Таким образом, он не знает size
and range
и array
. Вы должны использовать объекты a
и b
. Это должно быть что-то вроде этого:
matrix operator - (const matrix amp; a, const matrix amp; b)
{
if(a.size != b.size)
throw std::exception(...);
matrix temp(a.size, a.range);
for (int i = 0; i < a.size; i )
for (int j = 0; j < a.size; j )
temp.array[i][j] = a.array[i][j] - b.array[i][j];
return temp;
}
Ответ №2:
Хотя ваша функция friend могла бы получить доступ к личным данным объектов, но это не означает, что атрибуты находятся в области действия этой функции. Я имею в виду, это не будет действовать как функция-член, как вы ожидаете. Вам нужно будет указать размер одного из передаваемых вами объектов.