#include <iostream>

using namespace std;

class Modulo {
public:
    Modulo(int n = 0);

    int getNumber() const;          // interface
    
    static const int modulus;

private:
    int number;     // WARNING! can be abused, how to fix it?
};

const int Modulo::modulus = 7;

Modulo::Modulo(int n) {
    this->number = n % this->modulus;
}

int Modulo::getNumber() const {
   return this->number; 
}

Modulo operator+(Modulo &lhs, Modulo &rhs) {
    return Modulo(lhs.getNumber() + rhs.getNumber());
}

int main() {
    Modulo m(5), n(6), k;

    k = m + n;
    cout << m.getNumber() << " + " << n.getNumber()
         << " (mod " << Modulo::modulus << ") = " << k.getNumber() << endl;

    k = operator+(m, n);
    cout << m.getNumber() << " + " << n.getNumber()
         << " (mod " << Modulo::modulus << ") = " << k.getNumber() << endl;
    
    return 0;    
}
