0

对于我的任务,我必须做一个 Rational 类并添加运算符。如果分母的输入为 1 或分子为 0,则输出只需为分子。所以我想初始化我的复制构造函数,但我并没有真正成功(你可以看到我把它放在评论中)或者我需要改变我的打印功能?所以如果你能帮助我..谢谢你

//Rational.h
#ifndef Rational_h
#define Rational_h

#include <iostream>
using namespace std;

class Rational{
public:
    //default cstr
    Rational(int myNumerator=1, int myDenominator=1):numerator(myNumerator),denominator(myDenominator){}
    //copy cstr
    Rational (Rational const &num):numerator(num.getNumerator()),denominator(num.getDenominator()){
        /*if (denominator==1 or numerator==0) {
           // num=numerator;
        }*/
    }
    void setNumerator(int);
    void setDenominator(int);
    int getNumerator()const;
    int getDenominator()const;
    void print();
    void reduction(int,int);
    Rational operator/(Rational);

private:
    int numerator;
    int denominator;

};

#endif /* Rational_h */


//  Rational.cpp

void Rational::setNumerator(int myNumerator){
    numerator=myNumerator;
}
void Rational::setDenominator(int myDenominator){

    if (myDenominator==0){
        cout<<"ERROR"<<endl;
        denominator=1;
        }
    else
        denominator=myDenominator;
}

int Rational::getNumerator()const{
    return numerator;
}
void Rational::print(){
    cout<<numerator<<"/"<<denominator<<endl;
}

void Rational::reduction(int numerator,int denominator)
{
  for (int i = denominator * numerator; i > 1; i--)
     if ((denominator % i == 0) && (numerator % i == 0)) {
         denominator /= i;
         numerator /= i;
        }
}

Rational Rational::operator/(Rational num){
    Rational newNum;
    newNum.numerator=numerator*num.denominator;
    newNum.denominator=denominator*num.numerator;
    newNum.reduction(newNum.numerator, newNum.denominator);
    return newNum;
}
4

1 回答 1

0

您根本不需要在这里编写自己的复制构造函数。自动生成的复制构造函数会做你想做的事。如果您什么都不做,或者如果您明确要求它,它会更清楚地生成:

Rational (const  Rational& num)=default;

如果你的类包含指针,你通常只需要编写自己的复制构造函数,而这个没有。

至于您关于分母和分子的逻辑,它不属于复制构造函数。您拥有的任何规则都适用于所有对象,而不仅仅是复制的对象,因此它应该在另一个构造函数中。一个原始对象具有正确的值,那么任何副本也必须是正确的。

于 2020-04-16T14:22:58.110 回答