CIS29 - Example 5 - namespace my - my own cout

File: ns1.h

#ifndef NS1
#define NS1

#include <iostream>
#include <cassert>


namespace ns1
{
   class fraction;

   std::ostream& operator <<(std::ostream& out, const fraction&);

   class fraction
   {
   private:
      int numer, denom;
   public:
      explicit fraction(int n, int d) : numer(n), denom(d) 
      {
         assert(denom != 0);
      }
      fraction operator+(const fraction&);
      int getnumer() const { return numer; }
      int getdenom() const { return denom; }
      operator int() const;
      friend std::ostream& operator <<(std::ostream& out, const fraction&);
   };
}

#endif

File: ns2.h

#ifndef NS2
#define NS2

#include <iostream>
#include <cassert>

namespace ns2
{

   class fraction;

   fraction operator+(const fraction&, const fraction&);
   std::ostream& operator <<(std::ostream& out, const fraction&);

   class fraction
   {
   private:
      int numer, denom;
   public:
      fraction(int n, int d) : numer(n), denom(d) 
      {
         assert(denom != 0);
      }

      operator double() const;
      int getdenom() const { return denom; }
      int getnumer() const { return numer; }

      friend std::ostream& operator <<(std::ostream& out, const fraction&);
      friend fraction operator+(const fraction&, const fraction&) ;
   };
}

#endif

File: ns1.cpp

#include "ns1.h"

using ns1::fraction;

fraction fraction::operator+(const fraction& f)
{
   return fraction((numer*f.denom+denom*f.numer),denom*f.denom);
}

fraction::operator int() const
{
   return numer/denom;
}

std::ostream& ns1::operator <<(std::ostream& out, const fraction& f)
{
   out << f.getnumer() << '/' << f.getdenom();
   return out;
}

File: ns2.cpp

#include "ns2.h"

using ns2::fraction;

fraction ns2::operator+(const fraction& f, const fraction& g)
{
   return fraction((g.numer*f.denom+g.denom*f.numer),g.denom*f.denom);
}

fraction::operator double() const
{
   return 1.*numer/denom;
}

std::ostream& ns2::operator <<(std::ostream& out, const fraction& f)
{
   out << f.getnumer() << '/' << f.getdenom();
   return out;
}

File: ns_main.cpp

#include "ns1.h"
#include "ns2.h"
#include <cstdlib>

using namespace std;

int main()
{
   ns1::fraction f1(2,3);
   ns2::fraction f2(3,4);
   ns1::fraction f3(1,2);
   ns2::fraction f4(1,4);

   cout << f1 << endl;
   cout << f2 << endl;

   cout << f1 + f3 << endl;
   cout << f1 + f2 << endl;

   cout << f1 + 1 << endl;
   cout << f1 + 1.5 << endl;
   system("pause");    
   return 0;
}

***** Program output *****

2/3
3/4
7/6
0.75
1
1.5