主导用户定义的转换运算符

时间:2013-03-10 18:12:30

标签: c++

假设我有两个课程:AB。我定义了如何将A投放到BB投放到A。我还为这两者定义了operator<operator>operator==,因此我可以将AAB进行比较另一个B。然后我创建了一个类A的实例,例如aBb之一。if(a>b){...} 。我比较一下:

A

其中哪一个会转换为匹配另一个?有没有办法影响这个,除非明确地投射?

编辑:我举了一个问题的例子,希望这有助于解释我自己。 说我想存储整数。我可以将它们存储在BA中。在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}},这是我所期望的。

1 个答案:

答案 0 :(得分:0)

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

看起来像这样:

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

如果您希望在AB之间进行转换,则可以在B构造函数中执行A,这样您就可以执行此操作:

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

A a = someb;

等于A a(someb);