2010-10-06 41 views
6

我有一個叫AString的課。這是很基本的:如何爲指向類的指針重載operator ==()?

class AString 
{ 
public: 
    AString(const char *pSetString = NULL); 
    ~AString(); 
    bool operator==(const AString &pSetString); 
    ... 

protected: 
    char *pData; 
    int iDataSize; 
} 

現在我想寫這樣的代碼:

AString *myString = new AString("foo"); 
if (myString == "bar") { 
    /* and so on... */ 
} 

然而,現有的比較操作僅支持

if (*myString == "bar") 

如果我省略星號,則編譯器不高興。

有沒有辦法讓比較運算符比較*AStringconst char*

+4

爲什麼你動態分配'myString'?爲什麼不是'operator =='''const''成員?或者更好,它爲什麼是會員?或者甚至更好,你爲什麼要編寫自己的字符串類? – sbi 2010-10-06 10:36:19

+1

(1)我不應該。那是一個錯誤。 (2)你能詳細說明一下嗎? (3)爲什麼不成爲會員? (4)因爲目標平臺是一個沒有本地字符串類的嵌入式系統。 – bastibe 2010-10-06 11:57:30

+0

2.如果你不把它設爲const,那麼它不會爲const AString:s,3工作。因爲它不需要是成員並且會導致更好的封裝,4,你是什麼意思不是「本地字符串類」?你有std :: string。 – ronag 2010-10-06 12:51:20

回答

8

過載不,沒有。

要過載operator==,必須提供用戶定義的類型作爲操作數之一,並且指針(AString*const char*)不符合限定條件。
當比較兩個指針時,編譯器有一個非常合適的內置operator==,所以它不會考慮將其中一個參數轉換爲類類型。

2

[原件答案是錯誤的,因此,以下將改正]

正如所指出的奧利查爾斯沃思,在下面的註釋,這是不可能的。

您需要定義像

bool operator==(const AString *as, const char *cs); // Note: C++ will not do that 

操作,但除非它的一個參數是非原始類型,你不能超載運營商 - 和指針(兩個指針,以ASTRING和指針爲char)是原始類型。

+1

但這樣做可能會導致進一步的驚喜時比較指針之後! – Benoit 2010-10-06 09:23:14

+2

除非其中一個是非原始類型,否則不能重載操作符。 – 2010-10-06 09:23:52

+0

......應該說「非會員運營商」。 – 2010-10-06 09:30:52

10

除非你將它包裝在某種智能指針類中,否則會使語義變得很奇怪。 if (*myString == "bar")有什麼不對?

3

我想你想要的是錯誤的,因爲它掩蓋了C++的類型系統。 myString a 指針AString而不是AString。不要試圖隱藏它是一個指針的事實。這是醜陋錯誤的切入點,如果你在一個團隊中編寫代碼,其他人都不會感到困惑!

3
if (myString == "bar") 

即使你得到它的工作,是很容易混淆爲他人。你正在用一個字符串文字比較一個指向一個對象的指針。一個更清晰的方式得到這個工作是取消參考指針,並提供像

bool operator==(const char* pSetString);