と の 2 つのクラスがあるA
としB
ます。とにキャストする方法を定義A
します。また、とを両方とも定義しているので、 と を比較したり、を別の と比較したりできます。次に、クラスのインスタンスを作成します。たとえば、クラスのインスタンスを作成します。私はそれらを比較します:B
B
A
operator<
operator>
operator==
A
A
B
B
A
a
B
b
if(a>b){...}
それらのどれが他のものと一致するように変換されますか? 明示的にキャストする以外に、これに影響を与える方法はありますか?
編集:質問の例を作成しました。これが自分自身を説明するのに役立つことを願っています。整数を格納したいとします。A
または に保管できますB
。ではA
、正の値のみを保存します。ではB
、マイナスのみ。完全なコードは以下のとおりです。にa
変換される場合は true です。に変換される場合は false です。やってみて。私にとって、elsewise をキャストしない場合は false です。私が尋ねているのは、これらの状況で何が起こるかを確信できるように、変換を支配的にすることはできますか?B
a>b
b
A
a>b
ああ
#ifndef _A
#define _A
class B;
class A{
private:
int val;
public:
A(int val);
operator B()const;
bool operator==(const A& a)const;
bool operator>(const A& a)const;
bool operator<(const A& a)const;
};
#endif
Bh
#ifndef _B
#define _B
class A;
class B{
private:
int val;
public:
B(int val);
operator A()const;
bool operator==(const B& b)const;
bool operator>(const B& b)const;
bool operator<(const B& b)const;
};
#endif
A.cpp
#include "A.h"
#include "B.h"
A::A(int val){
this->val=val>=0?val:-val;
}
A::operator B()const{
return B(-val);
}
bool A::operator==(const A& a)const{
return val==a.val?true:false;
}
bool A::operator>(const A& a)const{
return val>a.val?true:false;
}
bool A::operator<(const A& a)const{
return val<a.val?true:false;
}
B.cpp
#include "A.h"
#include "B.h"
B::B(int val){
this->val=val>0?-val:val;
}
B::operator A()const{
return A(-val);
}
bool B::operator==(const B& b)const{
return val==b.val?true:false;
}
bool B::operator>(const B& b)const{
return val>b.val?true:false;
}
bool B::operator<(const B& b)const{
return val<b.val?true:false;
}
main.cpp
#include <iostream>
using namespace std;
#include "A.h"
#include "B.h"
int main(){
A a(5);
B b(-7);
if(a>b) cout << "a>b is true" << endl;
else cout << "a>b is false" << endl;
return 0;
}
編集:私にとっては、>
(メインで) キャストされるのは常に正しいオペランドです。また、比較演算子をフレンド関数として宣言すると、コードがコンパイルされずambiguous overload for 'operator>' in 'b > a'
、予想どおりのエラーが発生します。