вопрос с инициализацией моего конструктора (начальный вопрос) - PullRequest
0 голосов
/ 16 апреля 2020

для моего назначения я должен был создать класс 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;
}

1 Ответ

0 голосов
/ 16 апреля 2020

Вам вообще не нужно писать свой собственный конструктор копирования. Автоматически сгенерированный конструктор копирования будет делать то, что вы хотите. Он будет сгенерирован, если вы вообще ничего не будете делать, или более четко, если вы явно запросите его с помощью:

Rational (const  Rational& num)=default;

Обычно вам нужно написать собственный конструктор копирования, только если ваш класс содержит указатели, которые это не так.

Что касается вашей логики c относительно знаменателей и числителей, она не принадлежит конструктору копирования. Любые ваши правила применяются ко всем объектам, а не только к скопированным, и так должно быть в другом конструкторе. Если исходный объект имеет правильные значения, то любая копия также должна быть правильной.

...