Программа на C ++ с собственным классом для пар рациональных чисел, не работающих должным образом - PullRequest
1 голос
/ 27 ноября 2010

У меня проблема с кодом ниже. Сейчас он не выполняет никаких функций ... ни сложения, ни вычитания, ни деления, ни умножения.

Буду признателен за любую помощь ... Мне нужно объяснение ... чтобы я мог понять это и покончить с этим: D

#include <iostream>
using namespace std;

// Class Definitions

class RationalNumber
{
public:
     RationalNumber(int, int, int, int);                    
     RationalNumber operator+(RationalNumber);
     RationalNumber operator-(RationalNumber);
     RationalNumber operator*(RationalNumber);
     RationalNumber operator/(RationalNumber);
     RationalNumber operator<(RationalNumber);
     RationalNumber operator>(RationalNumber);
     RationalNumber operator<=(RationalNumber);
     RationalNumber operator>=(RationalNumber);
     RationalNumber operator==(RationalNumber);
     RationalNumber operator!=(RationalNumber);
private:
     int numerator;
     int denominator;
     int numerator2;
     int denominator2;

};  // end RationalNumber class


// RationalNumber class member-function definitions
RationalNumber::RationalNumber(int num, int denom, int num2, int denom2)
{
     numerator = num;
     denominator = denom;
     numerator2 = num2;
     denominator2 = denom2;

//for first fraction
     if (denominator == 0 || denominator < 0)
          cout << "ERROR:Denominator can not be zero or less than zero." << "\n";

     else
          //Reduces the fraction to lowest terms.
     {
          int i = numerator > denominator ? numerator : denominator;

          while(i > 1)
          {
               if(numerator % i == 0 && denominator % i == 0)  
               {
               numerator /= i;
               denominator /= i;
               }
               --i;
          }

     }

     cout << "Simplified fraction one is: " << numerator << " / "
        << denominator << "\n";

//For second fraction
     if (denominator2 == 0 || denominator2 < 0)
          cout << "ERROR:Denominator can not be zero or less than zero" << "\n";
     else
          //Reduces the fraction to lowest terms.
     {
          int j = numerator2 > denominator2 ? numerator2 : denominator2;

          while(j > 1)
          {
               if(numerator2 % j == 0 && denominator2 % j == 0)  
               {
               numerator2 /= j;
               denominator2 /= j;
               }
               --j;
          }

     }
     cout << "Simplified fraction two is: " << numerator2 << " / "
        << denominator2 << "\n";

}

// addition operator
RationalNumber RationalNumber::operator+(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator + a.numerator;
      temp.denominator = denominator + a.denominator;
      temp.numerator2 = numerator2 + a.numerator2;
      temp.denominator2 = denominator2 + a.denominator2;
      return temp;
}

// subtraction operator
RationalNumber RationalNumber::operator-(RationalNumber a)
{
     RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator - a.numerator;
      temp.denominator = denominator - a.denominator;
      temp.numerator2 = numerator2 - a.numerator2;
      temp.denominator2 = denominator2 - a.denominator2;
      return temp;
}

// multiplication operator
RationalNumber RationalNumber::operator*(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator * a.numerator;
      temp.denominator = denominator * a.denominator;
      temp.numerator2 = numerator2 * a.numerator2;
      temp.denominator2 = denominator2 * a.denominator2;
      return temp;
}

// division operator
RationalNumber RationalNumber::operator/(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator / a.numerator;
      temp.denominator = denominator / a.denominator;
      temp.numerator2 = numerator2 / a.numerator2;
      temp.denominator2 = denominator2 / a.denominator2;
      return temp;
}

int main()
{

     int top;
     int bot;
     int top2;
     int bot2;

     cout << "Please enter the Numerator for fraction one: \n";
     cin >> top;
     cout << "Please enter the Denominator for fraction one: \n";
     cin >> bot;
     cout << "Please enter the Numerator for fraction two: \n";
     cin >> top2;
     cout << "Please enter the Denominator for fraction two: \n";
     cin >> bot2;

     RationalNumber A(top, bot, top2, bot2);
     return 0;

}

Ответы [ 5 ]

4 голосов
/ 27 ноября 2010

Объявляя RationalNumber(int, int, int, int), вы автоматически удаляете конструктор по умолчанию, т. Е. Больше невозможно создать экземпляр вашего класса, вызывая конструктор без параметров.

Другими словами,

RationalNumber number;

больше невозможно.Вам нужно будет сказать

RationalNumber number(1,2,3,4);.

Если вы хотите иметь возможность создавать экземпляр с помощью конструктора по умолчанию, то вам нужно определить один в дополнение к другому конструктору:

RationalNumber()
{
    // Initialization
}
1 голос
/ 27 ноября 2010

Я сделаю быстрый снимок ...

#include <utility>

struct ratio {
    int numerator;
    int denominator;

    explicit ratio( int n = 0, int d = 1 )
        : numerator( n ), denominator( d ) { }

    ratio operator - () const {
        ratio x( * this );
        x.numerator = - x.numerator;
        return x;
    }

    ratio operator + () const
        { return *this; }
};

void reduce( ratio &x ) {
    int larger = x.numerator, smaller = x.denominator;
    if ( larger < smaller ) std::swap( larger, smaller );
    while ( int rem = larger % smaller ) {
        larger = smaller;
        smaller = rem;
    }
    x.numerator /= smaller;
    x.denominator /= smaller;
}


ratio &operator += ( ratio &l, ratio const &r ) {
    l.numerator = l.numerator * r.denominator
                + r.numerator * l.denominator;
    l.denominator *= r.denominator;
    reduce( l );
    return l;
}

ratio &operator -= ( ratio &l, ratio const &r )
    { return l += - r; }

ratio &operator *= ( ratio &l, ratio const &r ) {
    l.numerator *= r.numerator;
    l.denominator *= r.denominator;
    reduce( l );
    return l;
}

ratio &operator /= ( ratio &l, ratio const &r ) {
    l.numerator *= r.denominator;
    l.denominator *= r.numerator;
    reduce( l );
    return l;
}

Канонические определения для операторов +, -, *, /.

1 голос
/ 27 ноября 2010

Переопределите ваших операторов следующим образом:

RationalNumber RationalNumber::operator+(RationalNumber a)
{
      return RationalNumber(
          numerator + a.numerator,
          denominator + a.denominator,
          numerator2 + a.numerator2,
          denominator2 + a.denominator2);
}

Это позволяет избежать создания временного параметра без параметров, который вызывает у вас горе. Это также помогает компилятору использовать оптимизацию возвращаемого значения (RVO).

0 голосов
/ 27 ноября 2010

теперь проблема в том, что ... не выполняется ни добавление, ни какие-либо другие функции ... программа работает отлично, но каким-то образом я заставляю дополнения и другие функции работать

спасибо

#include <iostream>
using namespace std;

// Class Definitions

class RationalNumber
{
public:
     RationalNumber(int, int, int, int);                    
     RationalNumber operator+(RationalNumber);
     RationalNumber operator-(RationalNumber);
     RationalNumber operator*(RationalNumber);
     RationalNumber operator/(RationalNumber);
     RationalNumber operator<(RationalNumber);
     RationalNumber operator>(RationalNumber);
     RationalNumber operator<=(RationalNumber);
     RationalNumber operator>=(RationalNumber);
     RationalNumber operator==(RationalNumber);
     RationalNumber operator!=(RationalNumber);
private:
     int numerator;
     int denominator;
     int numerator2;
     int denominator2;

};  // end RationalNumber class


// RationalNumber class member-function definitions
RationalNumber::RationalNumber(int num, int denom, int num2, int denom2)
{
     numerator = num;
     denominator = denom;
     numerator2 = num2;
     denominator2 = denom2;

//for first fraction
     if (denominator == 0 || denominator < 0)
          cout << "ERROR:Denominator can not be zero or less than zero." << "\n";

     else
          //Reduces the fraction to lowest terms.
     {
          int i = numerator > denominator ? numerator : denominator;

          while(i > 1)
          {
               if(numerator % i == 0 && denominator % i == 0)  
               {
               numerator /= i;
               denominator /= i;
               }
               --i;
          }

     }

     cout << "Simplified fraction one is: " << numerator << " / "
        << denominator << "\n";

//For second fraction
     if (denominator2 == 0 || denominator2 < 0)
          cout << "ERROR:Denominator can not be zero or less than zero" << "\n";
     else
          //Reduces the fraction to lowest terms.
     {
          int j = numerator2 > denominator2 ? numerator2 : denominator2;

          while(j > 1)
          {
               if(numerator2 % j == 0 && denominator2 % j == 0)  
               {
               numerator2 /= j;
               denominator2 /= j;
               }
               --j;
          }

     }
     cout << "Simplified fraction two is: " << numerator2 << " / "
        << denominator2 << "\n";

}

// addition operator
RationalNumber RationalNumber::operator+(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator + a.numerator;
      temp.denominator = denominator + a.denominator;
      temp.numerator2 = numerator2 + a.numerator2;
      temp.denominator2 = denominator2 + a.denominator2;
      return temp;
}

// subtraction operator
RationalNumber RationalNumber::operator-(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator - a.numerator;
      temp.denominator = denominator - a.denominator;
      temp.numerator2 = numerator2 - a.numerator2;
      temp.denominator2 = denominator2 - a.denominator2;
      return temp;
}

// multiplication operator
RationalNumber RationalNumber::operator*(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator * a.numerator;
      temp.denominator = denominator * a.denominator;
      temp.numerator2 = numerator2 * a.numerator2;
      temp.denominator2 = denominator2 * a.denominator2;
      return temp;
}

// division operator
RationalNumber RationalNumber::operator/(RationalNumber a)
{
      RationalNumber temp=RationalNumber(1,2,3,4);
      temp.numerator = numerator / a.numerator;
      temp.denominator = denominator / a.denominator;
      temp.numerator2 = numerator2 / a.numerator2;
      temp.denominator2 = denominator2 / a.denominator2;
      return temp;
}

int main()
{

     int top;
     int bot;
     int top2;
     int bot2;

     cout << "Please enter the Numerator for fraction one: \n";
     cin >> top;
     cout << "Please enter the Denominator for fraction one: \n";
     cin >> bot;
     cout << "Please enter the Numerator for fraction two: \n";
     cin >> top2;
     cout << "Please enter the Denominator for fraction two: \n";
     cin >> bot2;

     RationalNumber A(top, bot, top2, bot2);
     return 0;

}
0 голосов
/ 27 ноября 2010

Ваш класс не имеет конструктора, который принимает нулевые аргументы.Поэтому следующий код:

class object=class();

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

class object(1, 2, 3, 4);
class object2 = class(1, 2, 3, 4);
...