[解決済み] 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;
}
}
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Enterキーを押して続行する
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】'cout'は型名ではない
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】'std::cout'への未定義の参照