非メンバの演算子オーバーロード 解答ページ | Programming Place Plus C++編【言語解説】 第35章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① 「幅」と「高さ」をまとめて「大きさ」を表現する Sizeクラスを定義し、必要と思われる演算子をオーバーロードしてください。「幅」と「高さ」は int型で表現されるものとします。


たとえば、次のように、加減算と比較に関する演算子を定義します。

#include <iostream>

class Size {
public:
    Size(int width, int height) :
        mWidth(width), mHeight(height)
    {}

    inline Size& operator+=(const Size& rhs)
    {
        mWidth += rhs.GetWidth();
        mHeight += rhs.GetHeight();
        return *this;
    }

    inline Size& operator-=(const Size& rhs)
    {
        mWidth -= rhs.GetWidth();
        mHeight -= rhs.GetHeight();
        return *this;
    }

    inline int GetWidth() const
    {
        return mWidth;
    }

    inline int GetHeight() const
    {
        return mHeight;
    }

    inline int GetArea() const
    {
        return mWidth * mHeight;
    }

private:
    int mWidth;
    int mHeight;
};

const Size operator+(const Size& lhs, const Size& rhs)
{
    return Size(lhs) += rhs;
}

const Size operator-(const Size& lhs, const Size& rhs)
{
    return Size(lhs) -= rhs;
}

bool operator==(const Size& lhs, const Size& rhs)
{
    return lhs.GetWidth() == rhs.GetWidth()
        && lhs.GetHeight() == rhs.GetHeight()
        ;
}

bool operator!=(const Size& lhs, const Size& rhs)
{
    return !(lhs == rhs);
}

bool operator<(const Size& lhs, const Size& rhs)
{
    return lhs.GetArea() < rhs.GetArea();
}

bool operator>(const Size& lhs, const Size& rhs)
{
    return lhs.GetArea() > rhs.GetArea();
}

bool operator<=(const Size& lhs, const Size& rhs)
{
    return !(lhs > rhs);
}

bool operator>=(const Size& lhs, const Size& rhs)
{
    return !(lhs < rhs);
}

std::ostream& operator<<(std::ostream& lhs, const Size& rhs)
{
    lhs << rhs.GetWidth() << ", " << rhs.GetHeight();
    return lhs;
}

int main()
{
    Size s1(5, 10);
    Size s2(10, 5);

    s1 = s1 + s2;
    std::cout << s1 << std::endl;

    s1 = s1 - s2;
    std::cout << s1 << std::endl;

    s1 += s2;
    std::cout << s1 << std::endl;

    s1 -= s2;
    std::cout << s1 << std::endl;

    s1 += Size(1, 1);
    std::cout << std::boolalpha 
              << (s1 == s2) << "\n"
              << (s1 != s2) << "\n"
              << (s1 < s2) << "\n"
              << (s1 > s2) << "\n"
              << (s1 <= s2) << "\n"
              << (s1 >= s2) << std::endl;
}

実行結果:

15, 15
5, 10
15, 15
5, 10
false
true
false
true
false
true


参考リンク

更新履歴

’2017/2/15 新規作成。



第35章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る