2017-01-31 1 views
-4

Мои классы фракций перегруженных операторов не будут компилироваться, заявив, что они должны быть унарным или двоичным оператором. (C++) После поиска, я нашел совет, который заставил их друзей удалить неявный первый термин, но мои операторы были друзьями все это время и все еще возвращают «ошибка: перегруженный оператор» - должен быть унарным или двоичным оператор (имеет 3 параметра) ", когда я иду на компиляцию.(C++) Мои перегруженные функции оператора все возвращают ошибку, что они должны быть унарными или двоичными, несмотря на то, что они друзья

Здесь они находятся в моем файле заголовка

friend std::ostream& operator<<(std::ostream& os, const Fraction& frac); //printing 
friend std::istream& operator>>(std::istream& is, Fraction& frac); // reading 
friend const Fraction operator+(const Fraction& x, const Fraction& y); // adding 
friend const Fraction operator-(const Fraction& x, const Fraction& y); // subtract 

и здесь определения для каждого из этих

std::ostream& Fraction::operator<<(std::ostream& os, const Fraction& frac) //printing 
{ 
    if(num % den == 0) 
     cout << num/den << endl; 
    else 
     cout << num << "/" << den << endl; 
} 

std::istream& Fraction::operator>>(std::istream& is, Fraction& frac) // reading 
{ 
    int pc; //peek character 

    is >> skipws >> num; // read numerator, skipping whitespace 

    pc = is.peek(); // check next character 

    if(is && isspace(pc)) //if whitespace after the numerator 
    { 
     while(is && isspace(pc)) 
     { 
      is.get(); // eat space 
      pc = is.peek(); // move through the stream 
     } 
    } 
    else if(is && pc == '/') 
    { 
     is.get(); // eat the '/' 
     is >> skipws >> den; 
    } 

    if(den == 0) 
    { 
     throw invalid_argument("denominator is zero"); 
    } 

    if(den < 0) 
    { 
     num = num * -1; 
     den = den * -1; 
    } 
} 

const Fraction Fraction::operator+(const Fraction& x, const Fraction& y) // adding 
{ 
    Fraction temp1; 
    Fraction temp2; 
    if(x.getden() == y.getden()) 
    { 
     temp1.set(x.getnum() + y.getnum(), x.getden()); 
    } 
    else 
    { 
     temp1.set(x.getnum() * y.getden(), x.getden() * y.getden()); 
     temp2.set(y.getnum() * x.getden(), y.getden() * x.getden()); 
     temp1.set(temp1.getnum() + temp2.getnum(), temp1.getden()); 
    } 
    reduceFrac(temp1); 
    return temp1; 
} 

const Fraction Fraction::operator-(const Fraction& x, const Fraction& y) // subtracting 
{ 
    Fraction temp1; 
    Fraction temp2; 
    if(x.getden() == y.getden()) 
    { 
     temp1.set(x.getnum() - y.getnum(), x.getden()); 
    } 
    else 
    { 
     temp1.set(x.getnum() * y.getden(), x.getden() * y.getden()); 
     temp2.set(y.getnum() * x.getden(), y.getden() * x.getden()); 
     temp1.set(temp1.getnum() - temp2.getnum(), temp1.getden()); 
    } 
    reduceFrac(temp1); 
    return temp1; 

} 
+0

Почему все эти члены «Фракции»? – user2357112

+0

не являются функциями друзей, а не членами класса? – ellihts

+0

Участники класса не нуждаются в дружбе, чтобы получить доступ к частным вещам. – chris

ответ

0

Другу функции не являются членами экземпляра класса. Они являются статическими, а также членами других классов или классом.

Создание их друзей не будет «устранять подразумеваемый первый термин», что бы это ни значило. Составляя их членов экземпляра удаляет явный первый срок (делая его неявным: this), что является вашей реальной проблемой: они являются членами, и у них есть явный первый термин. Либо сделайте их статическими, либо удалите friend и первые условия.

Создание членов друзей собственного класса является излишним.

+0

Спасибо, у меня есть + - теперь это было действительно полезно. Тем не менее, я до сих пор не понимаю, почему я удаляю первый термин для операторов вставки/извлечения. могу ли я действительно удалить поток из каждой из своих деклараций безопасно (при редактировании определения в соответствии с этим)? Edit: после попытки удалить ostream теперь он говорит мне, что имеет только один параметр и должен быть двоичным оператором - не уверен, что я сделал – ellihts

+0

Если это член экземпляра, имплицитным первым операндом является 'this'. У статических функций нет 'this', поэтому вы должны явно предоставить первый операнд. Я не понимаю ваш последний вопрос или то, что вы сделали, чтобы спровоцировать ошибку. Либо сделайте двоичный оператор функции экземпляров членов с одним аргументом, либо статические функции с двумя. Унарные операторские функции должны иметь нуль или один аргумент соответственно. – EJP

Смежные вопросы