// compile with: g++ hello.cpp

#include<iostream>
#include<string>
#include<vector>

using namespace std;

// class is like struct... but
// - classes have methods - functions that run on the object
// - classes can make their data private
class myData {
private:
  int x, y;

public:
  
  myData(int n1, int n2) {
    x = n1; y = n2;
  }

  myData() {
    x = y = 0;
  }

  int getX() const {
    return x;
  }

  void setX(int n) {
    x = n;
  }

  int getY() const {
    return y;
  }

  void setY(int n) {
    y = n;
  }

  myData operator+(const myData &param) {
    myData temp;
    temp.x = x + param.x;
    temp.y = y + param.y;
    return temp;
  }

  myData& operator=(const myData &param) {
    x = param.x;
    y = param.y;
    return *this;
  }

  myData *pointerToMe() {
    return this;
  }
};

ostream &operator<<(ostream &os, myData const &m) {
  return os << "(" << m.getX() << ", " << m.getY() << ")";
}

int main(int argc, char * argv[]) {

  cout << "x: "; int x; cin >> x;
  
  cout << "y: "; int y; cin >> y;
  
  myData m(x, y);

  // note - we have overloaded the ostream<< operator for myData
  // it gets run something like operator<<(cout, m);
  cout << m << endl;

  myData m2 = m + m;

  cout << m2 << endl;

  cout << "&m = " << &m << endl;
  cout << "&m2 = " << &m2 << endl;
  cout << "m.pointerToMe = " << m.pointerToMe() << endl;
  cout << "m2.pointerToMe = " << m2.pointerToMe() << endl;
  
  return 0;
}