#include <iostream>

using namespace std;

class A{
    // class のメンバ変数は標準で private 
    double x;
public:
    // 以下は public 領域であり，外部から参照可能
    A operator+(A a) // やりたいこと: (*this) + a;
    {
    }
    A operator-(A a) // やりたいこと: (*this) - a;
    {
    }
    bool operator>(A a) // やりたいこと: (*this) > a;
    {
    }
    bool operator==(A a){ // やりたいこと: (*this) == a;
    }
    A operator*(double s) // やりたいこと: (*this)*s; 
    {
    }
    double& operator[](int i){ // やりたいこと: (*this).x = some thing; 
    }
    A operator=(A a){ // やりたいこと: (*this) = a; 
    }
    A& operator<<(double a){ // やりたいこと: (*this) << a; 
    }

    // 何か好きな演算子を一つ実装してみること．以下の表に使える演算子が記載されている．
    // https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
};
// 以下に正しい出力を示しておく．これは，11th.operator.base.cpp をコンパイルし実行した結果と同じである．
// 1, 2
// 1 < 2
// 1 != 2
// 3, 2
// 1, 2
// 2, 2
// 4
// 8
// 10
// 16

int main(){
    // ----- ここから END まで改変不可 --------
    A a1, a2;

    a1[0] = 1;
    a2[-1] = 2; // どんな添字を入れても，a2.x の参照が返ってくる．興味深い動作だと思うが，どうだろうか．

    cout << a1[-9999] << ", " << a2[0] << "\n";

    if(a1 > a2){
        cout  << a1[1651651] << " > " << a2[0] << "\n";
    }else{
        cout << a1[0] << " < " << a2[0] << "\n";
    }

    if(a1 == a2){
        cout << a1[0] << " == " << a2[0] << "\n";
    }else{
        cout << a1[0] << " != " << a2[0] << "\n";
    }

    a1 = a1 + a2;
    cout << a1[0] << ", " << a2[0] << "\n";

    a1 = a1 - a2;
    cout << a1[0] << ", " << a2[0] << "\n";

    a1 = a2;
    cout << a1[0] << ", " << a2[0] << "\n";

    a1 = a1*2;
    cout << a1[0] << "\n";
    a1 = a1 + a2*2; // クラスに実装された演算子は，四則演算と同じ優先順位が反映されることがわかる．つまり，a2*2 が先に実行される．ちなみに，= の優先順位は + よりも低いこともわかる．
    cout << a1[0] << "\n";

    a1 << 2;
    cout << a1[0] << "\n";

    a1 << 1 << 2 << 3;
    cout << a1[0] << "\n";
    // ------- END: ここまで改変不可 ----------
    // 以下に，自ら実装した演算子を試験するコードを実装せよ．
    // 試験コードを考えることはプログラミングで非常に大事で，特に初心者と経験者の大きな違いが，試験能力にあると私は思う．
    // 試験コードの作成に慣れれば，バグチェックを行う能力も向上するだろう．


    return 0;
}