1. ホーム
  2. c++

[解決済み] C++で比較可能なクラスを作成する方法

2022-02-04 07:28:08

質問

C++でインターフェースを作りたいのですが、どうすればいいですか? 演算子のオーバーロード文でop2.radiusの値を取得するにはどうしたらよいでしょうか。 比較級を矩形や線分などにも使えるようにしたいのですが。

#include <iostream>
using namespace std;

class Comparable {
      public:
             virtual bool operator > (Comparable& op2)=0;
             //virtual bool operator < (Comparable& op2)=0;
             //virtual bool operator == (Comparable& op2)=0;
};

class Circle : public Comparable {
      int radius;
      public:
             Circle(int radius=1) { this->radius = radius; }
             int getRadius() { return radius; }
             bool operator > (Comparable& op2)
             {
                  if (radius > op2.radius) // <-- here!
                  return true;
                  else
                  return false;
             }

};

template <class T>
T bigger(T a, T b){
           if (a > b) return a;
           else
           return b;
}

void main()
{
    Circle waffle(10), pizza(20), y;
    y = bigger(waffle, pizza);
    cout << "the bigger one is " << y.getRadius() << endl;
}

解決方法は?

ダウンキャストを行う必要があります。半径を求める一般的な方法はありません。
渡されるオブジェクトがCircle型だけであることが確実であれば、静的キャストで十分です。
そうでない場合は、dynamic_cast を使って、Circle オブジェクトであるかどうかをチェックするようにします。もし失敗したら、単にfalseを返します。
注意:dynamic_castはパフォーマンスを低下させる可能性があります。

bool operator > (Comparable& op2)
{
    Circle* foo = dynamic_cast<Circle*>(&op2);
    if (foo && (radius > foo->getRadius()))
    {
        return true;
    }
    else
    {
        return false;
    }
}