2011-07-29 30 views
3

みんな私持っている構造体のは、X、それを呼ぼうと、それはそうのように見えるので、私はまた、この構造体へのポインタを返すFNC(ではない、それのメ​​ンバーを)持っているいくつかの愚かな:演算子オーバーロード==

struct X 
    { 
bool operator==(const X* right) 
{ 
//... 
} 
}; 

X* get(X* another) 
{ 
//... 
} 

I

if (get(a) == get(b))//here obviously I have two pointers returned to be compared 
{ 
//... 
} 

私も定義されて前述の状況で動作すると仮定X operator==(const X* right)のメンバーが、その理由のために:も指さそれらの構造体へのポインタを比較するために「しよう」のコードの行が、本当の意図は、これらの構造体を比較することである必要があり私はそれが理解していない。それを動作させる方法(私はif (get(a) == get(b))の行を変更することはできず、またgetはポインタを返さなければなりません)。

+2

できません。演算子オーバーロードは、オペランドの1つとしてユーザー定義の型を持たなければなりません。ポインタを返すために 'get(a)== get(b)'と 'get()'が必要な場合は、両方のオペランドがポインタであり、ユーザ定義型ではありません。あなたが '* get(a)== get(b)'を行うことができれば '演算子==(const X * right)'は動作しますが、できません。 –

+0

そのコード行を変更できないのはなぜですか? –

+3

なぜこれらの愚かな要求があるのか​​説明できますか? –

答えて

3

ポインタの比較方法を変更することはできません。 ifステートメントの構文を変更するか、ポインタの代わりに参照を返すようにget()を変更する必要があります。他の解決策はかなりハッキリです。

あなたが本当にそれらの制限と一緒に暮らす必要がある場合は、私が過負荷にoperator ->()で、あなたが欲しい、この一貫性のない動作をカプセル化するために、特殊なスマートポインタのいくつかの種類を返すようにget()を変更示唆してoperator ==()をオーバーロードします。私は誓っていますが、これは本当に問題を尋ねているだけです。私は、どんな力でもif()のステートメントを変更することができなくても戦う方が良いと思います。

+0

@ 104から最後の文章を読んでくださいあなたはunique_ptrがそれについて大丈夫だろうと思いますか?私は生のポインタを使用する必要はありませんので、私はここで本当に推測しています。 – smallB

0
bool operator==(const X* right) 

は、XをX *と比較する。両方のコンパレータを宣言する方法があるかどうかわかりませんが、C++はちょっと錆びていて、友人にメソッドを与えるかもしれません。

3

これは機能しません:あなたのタイプはポインタであり、ビルトインタイプの演算子をオーバーロードすることはできません。だから、最初のオフ、あなたは間接参照によって比較:オペレータはconstのことや取るべきだと

struct T { 
    bool operator==(const T & other) const { ... } 
    /* ... */ 
}; 

注:

T * a, * b; 

if (*a == *b) { ... } 

アップ次に、この作品を作るために、あなたはTの演算子を実装する必要があります。 const参照による右辺引数!

は、あなたの最後の文を参照してください:あなたは両方のあなたも getの種類を変更することはできません get(a) == get(b) を変更しないことができるなら、あなたはポインタを比較立ち往生しています。

2

get(a) == get(b)行を変更できず、get()を変更できない場合は、達成しようとしているものは不可能です。

オーバーロードされた演算子は、少なくとも1つのオペランドがユーザー定義型(またはユーザー定義型への参照)の場合にのみ定義できます。クラスへのポインタはその要件を満たしていないので、2つのポインタが比較されるところで呼び出される演算子を定義することはできません。