简体   繁体   English

成员构造函数定义不正确

[英]Incorrect member constructor definition

My program works, but it is telling me there are errors with this function 我的程序可以运行,但是它告诉我此函数有错误

Fraction(int a, int b)
// generate a fraction which is a/b
{
        num = a;
    if(b > 0)
        den = b;
    else
        den = 1;  
}

My program is written to output the error instead of the compiler giving me an error, so the program says this member constructor is incorrect and I need to make sure the denom is never negative. 我的程序是为输出错误而不是由编译器输出错误而编写的,因此程序说此成员构造函数不正确,因此我需要确保符号永远不会为负。 Whats wrong with it? 它出什么问题了?

#include <iostream>
#include <cmath>
#include <cassert>

using namespace std;

class Fraction
{
public:
// constructor

Fraction(int a, int b)
// generate a fraction which is a/b
{
        num = a;
    if(b > 0)
        den = b;
    else
        den = 1;  
}

Fraction(int a)
// generate a fraction which is a/1
{
num=a;
den=1;
}

Fraction()
// generate a fraction which is 0/1. i.e 0
{
num=0;
den=1;
}

// member functions

int get_numerator() const
// return the numerator of the fraction
{
return num;
}

int get_denominator() const
// return the denominator of the fraction
{
    return den;
}

void reduce()
// reduce this fraction to simplest form. For instance,
// 2/4 will be reduced to 1/2
{
    num /= gcd();
    den /= gcd();
}

Fraction reciprocal() const
// return the reciprocal of this Fraction
{
    return Fraction(den, num);
}

// friend functions

friend Fraction operator +(const Fraction& f1, const Fraction& f2)
// return the sum of f1 and f2,
// the result is reduced
{
    int n = f1.num * f2.den + f2.num * f1.den;
    int d = f1.den * f2.den;
    Fraction temp = Fraction(n, d);
    temp.reduce();
    return temp;
}

friend Fraction operator -(const Fraction& f1, const Fraction& f2)
// return the difference of f1 and f2,
// the result is reduced
{
    int n = f1.num *f2.den - f2.num * f1.den;
    int d = f1.den * f2.den;
    Fraction temp = Fraction(n, d);
    temp.reduce();
    return temp;
}

friend Fraction operator *(const Fraction& f1, const Fraction& f2)
// return the product of f1 and f2,
// the result is reduced
{
    int n = f1.num * f2.num;
    int d = f1.den * f2.den;
    Fraction temp = Fraction(n, d);
    temp.reduce();
    return temp;
}

friend Fraction operator /(const Fraction& f1, const Fraction& f2)
// return the quotient of f1 and f2,
// the result is reduced
{
    int n = f1.num * f2.den;
    int d = f1.den * f2.num;
    Fraction temp = Fraction(n, d);
    temp.reduce();
    return temp;
}

friend Fraction operator -(const Fraction& f)
// return the negation of f
{
    Fraction temp;
    temp.num=-f.num;
    return temp;
}

friend bool operator < (const Fraction& f1, const Fraction& f2)
// return true if f1 is less than f2.
// False otherwise
{
    return f1.num*f2.den < f2.num*f1.den;
}

friend bool operator > (const Fraction& f1, const Fraction& f2)
// return true if f1 is greater than f2.
// False otherwise
{
    return f1.num*f2.den > f2.num*f1.den;
}

friend bool operator <= (const Fraction& f1, const Fraction& f2)
// return true if f1 is less or equal to f2.
// False otherwise
{
    return f1.num*f2.den <= f2.num*f1.den;
}

friend bool operator >= (const Fraction& f1, const Fraction& f2)
// return true if f1 is greater or equal to f2.
// False otherwise
{
    return f1.num*f2.den >= f2.num*f1.den;
}

friend bool operator == (const Fraction& f1, const Fraction& f2)
// return true if f1 is equal to f2.
// False otherwise
{
    return f1.num*f2.den == f2.num*f1.den;
}

friend bool operator != (const Fraction& f1, const Fraction& f2)
// return true if f1 is not equal to f2.
// False otherwise
{
    return f1.num*f2.den != f2.num*f1.den;
}

friend istream& operator >> (istream& in, Fraction& f)
// input f in the form of a/b, where b cannot be zero. Also,
// if b is negative, the Fraction will change b to be positive.
// So, again, 1/-3 will be changed to -1/3
{
    char temp;
    in >> f.num >> temp >> f.den;
    if(f.den < 0)
    {
        f.num *= -1;
        f.den *= -1;
    }

    return in; 
 }

friend ostream& operator << (ostream& out, Fraction& f)
// output a Fraction f in form of a/b
{
    out << f.num << " / " << f.den;
    return out; 
}


private:
int num; // numerator of the fraction
int den; // denominator of the fraction

int gcd();
// A prvate function that is used to find the gcd of numerator
// and denominator by using Euclidean Algorithm
};

// all following test functions are given

double test1();
// test all constructors and two get methods.
// All these functions worth 1.5 points

double test2();
// test neg, reduce, and reciprocal functions.
// All these functions worth 1.5 points

double test3();
// test add, sub, mul, and div functions.
// All these functions worth 3 points

double test4();
// test less, greater, equal, less_or_equal, greater_or_equal,
// not_equal. All these functions worth 2 points

 double test5();
// test input and output function. This two functions worth 1 points

for a=3 and b=-4 your constructor will set num=3 and denom=1 . 对于a=3b=-4您的构造函数将设置num=3denom=1 You need to either correct the expectation at the caller side or fix the code to do: 您需要在调用者端更正期望值或修复代码以执行以下操作:

if (den > 0){
   num = a;
   den = b;
}
else{
   den = -b;
   num = -a
}

Also to add on to the solution above, handle the case of den == 0 above so.. 同样要添加到上面的解决方案中,因此也要处理den == 0的情况。

if(den == 0)
{
  den = 1 ;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM