假设我有两个课程: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
中,只有否定。完整代码如下。如果B
转换为a>b
,则b
为真。如果A
转换为a>b
,则为false。试试看。对我而言,如果我不反对,#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
是假的。我要问的是,转换是否可以占主导地位,以便在这些情况下,我可以肯定会发生什么?
A.H
#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
B.h
#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;
}
A.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;
}
B.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;
}
的main.cpp
>
编辑:对我而言,它始终是ambiguous overload for 'operator>' in 'b > a'
的正确操作数(在主中)。此外,如果我将比较运算符声明为友元函数,则代码将不会编译,错误{{1}},这是我所期望的。
答案 0 :(得分:0)
operator>
不会投出任何东西。它只会将两个操作数与定义的重载进行比较。如果没有这样的重载,则代码将无法编译。
看起来像这样:
bool operator>(const A& lhs, const B& rhs)
{
return lhs.foo > rhs.bar; //
}
如果您希望在A
和B
之间进行转换,则可以在B
构造函数中执行A
,这样您就可以执行此操作:
A::A(const B& b) {} //do stuff to convert B to A
A a = someb;
等于A a(someb);