/* Voorbeeldcode behorende bij het college "Programmeertechnieken",
 * LIACS, Universiteit Leiden.
 */

#include <iostream>

#include <vector>

class Coordinaat
{
  private:
    int x, y;

    /* Declareer als "friend function" zodat de functie de private members
     * mag lezen.
     */
    friend std::ostream &operator<<(std::ostream &out, const Coordinaat &c);

  public:
    Coordinaat(void)
      : x(0), y(0)
    { }
    Coordinaat(const int x, const int y)
      : x(x), y(y)
    { }

    inline int getX(void) const
    {
      return x;
    }

    inline int getY(void) const
    {
      return y;
    }

    /* Overload operator +=. We tellen "b" op bij "this". Let op, geef een
     * reference naar onszelf als returnwaarde.
     */
    Coordinaat &operator+=(const Coordinaat &b)
    {
      this->x += b.x;
      this->y += b.y;
      return *this;
    }
};

/* Overload operator +, maak een nieuw coordinaat c en hergebruik de
 * implementatie van "+=".
 */
Coordinaat operator+(const Coordinaat &a, const Coordinaat &b)
{
  Coordinaat c(a);
  c += b;
  return c;
}

std::ostream &operator<<(std::ostream &out, const Coordinaat &c)
{
  return out << "(" << c.x << ", " << c.y << ")";
}


int main(void)
{
  Coordinaat a(3, 5);
  Coordinaat b(5, 7);

  Coordinaat c = a + b;
  std::cout << a << std::endl;
  std::cout << b << std::endl;
  std::cout << c << std::endl << std::endl;

  b += c;
  std::cout << b << std::endl;

  /* We kunnen Coordinaat ook in een vector stoppen. */
  std::vector<Coordinaat> coordinaten;
  coordinaten.push_back(Coordinaat(3, 4));
  coordinaten.push_back(Coordinaat(16, 1));
  coordinaten.push_back(Coordinaat(1, 5));

  for (std::vector<Coordinaat>::const_iterator it = coordinaten.begin();
       it != coordinaten.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  return 0;
}