C++ 如何允许用户更改分数的值?

C++ 如何允许用户更改分数的值?,c++,class,abstract-data-type,C++,Class,Abstract Data Type,我应该编写一个程序,将num和denom作为分数类的数据成员。我还应该包括一个构造函数,该构造函数设置为等于1或允许用户初始化,一个重载运算符函数为+,以及一个可以显示对象数据值的成员函数。此外,它应该禁止分母值为0。 如何允许用户更改分数的值?我应该怎么做才能禁止0被用作分母?当我运行程序时,它只显示前4行中的单词,但不允许用户输入 #include <iostream> using namespace std; class Fractions { private: i

我应该编写一个程序,将num和denom作为分数类的数据成员。我还应该包括一个构造函数,该构造函数设置为等于1或允许用户初始化,一个重载运算符函数为+,以及一个可以显示对象数据值的成员函数。此外,它应该禁止分母值为0。 如何允许用户更改分数的值?我应该怎么做才能禁止0被用作分母?当我运行程序时,它只显示前4行中的单词,但不允许用户输入

#include <iostream>

using namespace std;

class Fractions
{
private:
    int num;
    int denom;
public:
    Fractions() : num(1), denom(1) {}
    Fractions(int numerator, int denominator) 
        : num(numerator), denom(denominator) {}

    Fractions& operator+=(Fractions f);

    int numerator() const { return num; }
    int denominator() const { return denom; }

};

Fractions& Fractions::operator+=(Fractions f)
{
    if (denom != f.denom)
    {
        int new_base = denom * f.denom;

        num *= new_base / denom;
        denom = new_base;

        f.num *= new_base / f.denom;
        f.denom = new_base;
    }

    num += f.num;
    return *this;
}

// operator+ is commonly implemented in terms of operator+=
Fractions operator+(Fractions a, const Fractions& b)
{
    return a += b;
}

std::ostream& operator<<(std::ostream& os, const Fractions& f)
{
    os << f.numerator();

    if (f.denominator() != 1)
        os << '/' << f.denominator();

    return os;
}

int main()
{
    int w, x, y, z;
    Fractions a(w, x);
    Fractions b(y, z);

    std::cout << "Enter the first numerator: " << endl;
    std::cin >> w;
    std::cout << "Enter the first denominator: " << endl;
    std::cin >> x;
    std::cout << "Enter the second numerator: " << endl;
    std::cin >> y;
    std::cout << "Enter the second denominator: " << endl;
    std::cin >> z;

    std::cout << a << " + " << b << " = " << a + b << '\n';
}
#包括
使用名称空间std;
类分数
{
私人:
int-num;
int-denom;
公众:
分数():num(1),denom(1){
分数(整数分子、整数分母)
:num(分子),denom(分母){}
分数&运算符+=(分数f);
int分子()常量{return num;}
int分母()常量{return denom;}
};
分数和分数::运算符+=(分数f)
{
if(denom!=f.denom)
{
int new_base=denom*f.denom;
num*=新的\u基/denom;
denom=新的基础;
f、 num*=新基数/f.denom;
f、 denom=新的基础;
}
num+=f.num;
归还*这个;
}
//运算符+通常以运算符的形式实现+=
分数运算符+(分数a、常数分数和b)
{
返回a+=b;
}

std::ostream&operator用户输入后应使用变量:

int main()
{
    int w, x, y, z;

    std::cout << "Enter the first numerator: " << endl;
    std::cin >> w;
    std::cout << "Enter the first denominator: " << endl;
    std::cin >> x;
    std::cout << "Enter the second numerator: " << endl;
    std::cin >> y;
    std::cout << "Enter the second denominator: " << endl;
    std::cin >> z;

    Fractions a(w, x);
    Fractions b(y, z);

    std::cout << a << " + " << b << " = " << a + b << '\n';
intmain()
{
整数w,x,y,z;
std::cout w;
std::cout x;
std::cout y;
std::coutz;
分数a(w,x);
分数b(y,z);

std::cout代码中有几个问题

最重要的是,在读取用户输入之前初始化分数,而在读取之后应该初始化分数。因此,代码中的
cout
行只会产生垃圾

为了允许用户更改值,可以实现函数

int&numerator(){return num;}

int&分母(){return num;}

然后使用

例如,
a.分子()=5


此外,您可能希望更改代码,以便
运算符+
不会作为
运算符+=
实现,首先初始化变量。我这样做了,但它仍然不允许input@user3427349“不允许输入”是什么意思?请详细解释。结果是什么?您的期望是什么?返回对内部数据成员的引用是一种糟糕的编程实践,因为它会将您的类从黑框变为白框。在处理内部数据时,请使用setter/getter对。@user3427349,引用函数在您的类定义内n、 @RobbieE,就一般情况而言,你是绝对正确的。对于这个特殊的(小)类,我认为没有必要有一个黑匣子。