2011-07-29 187 views
3

傢伙,我有一些愚蠢的結構我們稱之爲X和我也有返回一個指向這個結構一FNC(不是其成員),所以它看起來像這樣:重載==操作符

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

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

我也有行代碼,「嘗試」的指針比較那些結構,但真正的意圖是比較指着那些結構:

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

無法完成。運算符重載必須具有用戶定義類型作爲操作數之一。如果您需要執行'get(a)== get(b)',並且'get()'需要返回一個指針,那麼這兩個操作數都是指針,即不是用戶定義的類型。 'operator ==(const X * right)'如果你可以做'* get(a)== get(b)',那麼它就會工作,但是你不能。 –

+0

爲什麼你不能改變那行代碼? –

+3

你能解釋爲什麼你有這些愚蠢的要求? –

回答

3

你不能改變指針的比較方式。您必須或者更改if語句的語法,或更改get()以返回引用而不是指針。任何其他解決方案將是相當黑客。

如果你真的必須使用這些限制生活,我建議改變get()返回某種專門的智能指針來封裝你想這個不一致的行爲,與超載operator ->()和超載operator ==()。不過,我發誓,這實際上只是在惹麻煩,我認爲你還是應該爭取任何不允許你改變陳述的權力。

+0

@ 104你覺得unique_ptr可以嗎?我不必使用原始指針,所以我只是在這裏猜測。 – smallB

0
bool operator==(const X* right) 

將X與X *進行比較。不確定是否有辦法爲X *聲明一個比較器,但是我的C++有點生疏,你可能會給朋友一個鏡頭。

3

這是行不通的:你的類型是指針,你不能爲內建類型重載操作符。所以,首先,你比較被取消引用:

T * a, * b; 

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

接下來,使這項工作,你必須實現T的操作:

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

注意,運營商應該爲const,並採取通過const引用獲得右手邊的參數!

參考你的最後一句話:如果你既無法改變get(a) == get(b)你也改變不了的類型get,然後你被卡住比較指針。

2

如果你不能改變行get(a) == get(b),你不能改變get()那麼你試圖實現的是不可能的。

僅當至少有一個操作數是用戶定義類型(或對用戶定義類型的引用)時才能定義重載操作符。指向類的指針不符合該要求,因此您無法定義將在兩個指針進行比較時調用的運算符。