1

假设我有两个课程:AB. 我定义了如何投射ABBA。我还定义了operator<,operator>并且operator==对于他们两个,所以我可以将 anA与 anA或 aB与另一个进行比较B。然后我创建了一个类的实例A,例如a一个类Bb。我比较它们:

if(a>b){...}

他们中的哪一个会被转换以匹配另一个?除了显式转换之外,有没有办法影响这一点?

编辑:我举了一个我的问题的例子,希望这有助于解释我自己。假设我想存储整数。我可以将它们存储在AB. 在A中,我只存储正值。中B,只有负数。完整代码如下。如果a转换为Ba>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',这是我所预料的。

4

1 回答 1

0

operator>不会施放任何东西。它只会将两个操作数与定义的重载进行比较。如果没有这样的重载,您的代码将无法编译。

它看起来像这样:

bool operator>(const A& lhs, const B& rhs)
{
   return lhs.foo > rhs.bar; //
}

如果你想在和之间进行转换AB你会接受构造函数BA所以你可以这样做:

A::A(const B& b) {} //do stuff to convert B to A

A a = someb;

这等于A a(someb);

于 2013-03-10T18:15:47.220 回答