7.2 The implementation

Now that we have determined the user interface, we can think of how a fraction can be represented internally. We'll pick the easiest method this time. We'll use an unsigned integer for the numerator, and another one for the denominator:

class Fraction
{
  private: // don't really need this
    unsigned den, num;
  public:
    Fraction(void); // initialization
    void add(const Fraction b, Fraction &sum);
    void sub(const Fraction b, Fraction &diff);
    void mult(const Fraction b, Fraction &product);
    void div(const Fraction b, Fraction &quotient);
    unsigned getDenominator(void);
    unsigned getNumerator(void);
    void setDenominator(unsigned den);
    void setNumerator(unsigned num);
    float getValue(void);
    void simplify(void);
};

Note that the class definition should be contained in a file named fraction.h. The implementation of the member functions should be contained in a source file named fraction.cc as follows (portions of it):

#include "fraction.h"
Fraction::Fraction(void)
{
  den = num = 1;
}

void Fraction::mult(const Fraction b, Fraction &product)
{
  product.num = num * b.num;
  product.den = den * b.den;
  simplify();
}

float Fraction::getValue(void)
{
  return (float)num/den;
}

void Fraction::simplify(void)
{
  // okay, I am lazy...
}

void Fraction::setDenominator(unsigned u)
{
  den = u;
}

void Fraction::setNumerator(unsigned u)
{
  num = u;
}

unsigned Fraction::getDenominator(void)
{
  return den;
}

unsigned Fraction::getNumerator(void)
{
  return num;
}

// ... etc

Now that we have the source file, we can compile it using the following command:

g++ -O -Wall -g -c fraction.cc

If the compilation is successful, we end up with an object file fraction.o.

Next, we can start to write code that uses fractions. For example, we may want to let a user input two fractions, and the program prints the product. We'll call this source file area.cc:

#include "fraction.h"
#include <iostream>

using namespace std;

void computeFracProduct(void)
{
  unsigned u1, u2;
  cout << "num1: numerator denominator" << endl;
  cin >> u1 >> u2;
  Fraction f1;
  f1.setNumerator(u1);
  f1.setDenominator(u2);
  cout << "num2: numerator denominator" << endl;
  cin >> u1 >> u2;
  Fraction f2;
  f2.setNumerator(u1);
  f2.setDenominator(u2);
  Fraction product;
  f1.mult(f2, product);
  cout << "product is " << product.getNumerator() << "/" << product.getDenominator() << endl;
}

int main(void)
{
  computeFracProduct();
}

We now compile the consumer source file:

g++ -g -Wall -O -c area.cc

If this is successful, then we link the two object files:

g++ -g -o area area.o fraction.o



Copyright © 2006-09-07 by Tak Auyeung