Ошибка перегрузки оператора с помощью дружественной функции

#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 могла бы получить доступ к личным данным объектов, но это не означает, что атрибуты находятся в области действия этой функции. Я имею в виду, это не будет действовать как функция-член, как вы ожидаете. Вам нужно будет указать размер одного из передаваемых вами объектов.