1

と の 2 つのクラスがあるAとしBます。とにキャストする方法を定義Aします。また、とを両方とも定義しているので、 と を比較したり、を別の と比較したりできます。次に、クラスのインスタンスを作成します。たとえば、クラスのインスタンスを作成します。私はそれらを比較します:BBAoperator<operator>operator==AABBAaBb

if(a>b){...}

それらのどれが他のものと一致するように変換されますか? 明示的にキャストする以外に、これに影響を与える方法はありますか?

編集:質問の例を作成しました。これが自分自身を説明するのに役立つことを願っています。整数を格納したいとします。Aまたは に保管できますB。ではA、正の値のみを保存します。ではB、マイナスのみ。完全なコードは以下のとおりです。にa変換される場合は true です。に変換される場合は false です。やってみて。私にとって、elsewise をキャストしない場合は false です。私が尋ねているのは、これらの状況で何が起こるかを確信できるように、変換を支配的にすることはできますか?Ba>bbAa>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'、予想どおりのエラーが発生します。

4

1 に答える 1

0

operator>何もキャストしません。2 つのオペランドを定義済みのオーバーロードと比較するだけです。そのようなオーバーロードがない場合、コードはコンパイルされません。

次のようになります。

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

Aとの間の変換が必要な場合BBAコンストラクターを使用するので、これを実行できます。

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

A a = someb;

に等しいA a(someb);

于 2013-03-10T18:15:47.220 に答える