假设我有两个课程:A
和B
. 我定义了如何投射A
到B
和B
到A
。我还定义了operator<
,operator>
并且operator==
对于他们两个,所以我可以将 anA
与 anA
或 aB
与另一个进行比较B
。然后我创建了一个类的实例A
,例如a
一个类B
,b
。我比较它们:
if(a>b){...}
他们中的哪一个会被转换以匹配另一个?除了显式转换之外,有没有办法影响这一点?
编辑:我举了一个我的问题的例子,希望这有助于解释我自己。假设我想存储整数。我可以将它们存储在A
或B
. 在A
中,我只存储正值。中B
,只有负数。完整代码如下。如果a
转换为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
溴化氢
#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;
}
主文件
#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'
,这是我所预料的。