Мои перегруженные классы дроби не будут компилироваться, говоря, что они должны быть унарными или бинарными. (C ++)
Обыскав вокруг, я обнаружил совет, что создание их друзей уберет неявный первый термин, но мои операторы были друзьями все это время и по-прежнему возвращают «ошибку: перегруженный« оператор- »должен быть унарным или двоичным
оператор (имеет 3 параметра) «, когда я иду на компиляцию.
Вот они в моем заголовочном файле
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;
}
Функции друзей не являются экземплярами класса. Они статичны и принадлежат другим классам или вообще не имеют классов.
Подружиться с ними не удалит неявный первый термин, что бы это ни значило. Делать их члены инстанции удаляет явный первый термин (сделав его неявным: this
), что является вашей реальной проблемой: они являются членами, и у них есть явный первый термин. Либо сделайте их статичными, либо удалите friend
и первые сроки.
Создание друзей друзей своего класса является излишним.
Других решений пока нет …