2011-06-13 104 views
2

爲什麼這個代碼給出錯誤消息「智能感知:這個操作符的功能太多的參數」運營商+超載問題

int operator+(PerfectNum a,PerfectNum b) 
{ 
    return (a.thenum+b.thenum); 
} 

PerfectNum是一個普通班,並thenum是一個int。 此方法在課程中。

+3

這不是類方法嗎?如果你使它成爲PerfectNum的一種方法,那麼你只需要一個參數,並使用「this.thenum」作爲另一個參數。 – sleeves 2011-06-13 22:28:00

+1

這是你從編譯器得到的確切錯誤信息嗎?函數'int operator +(PerfectNum,PerfectNum)'返回太多參數? – Oswald 2011-06-13 22:28:52

+0

沒有編譯器會產生這樣的錯誤信息。在這裏發佈編譯器輸出時請使用複製和粘貼。 – 2011-06-13 22:29:57

回答

6

你正在將它定義爲一個成員函數,對吧?

在這種情況下,左側是簡單*this

// .h 
class PerfectNum 
{ 
    public: 
    int operator+(PerfectNum other) const; 
}; 

// .cpp 
int PerfectNum::operator+(const PerfectNum &other) const 
{ 
    return this->thenum + other.thenum; 
} 
+3

錯誤的種類。運營商應該是一個免費的功能,可能是一個朋友。如果它是一個成員,它應該是const。該參數應該是一個常量引用。語法錯誤 - 實現缺少返回類型。誰在投票這個東西? – 2011-06-13 22:54:23

+0

糟糕。你是對的,這是非常可怕的。昨天我有一個相當緊張的工作日,我需要擺脫它,但顯然我留下了一些我的知識:-) – 2011-06-14 14:29:20

+0

另外:我看到沒有理由,這不能成爲一個成員函數。我可能會錯過一些知識。請*幫助我,而不是僅僅批評一切,如果是這樣的話。我認爲它應該是一個成員函數,因爲它可以解釋爲什麼有太多的參數*(根據OP的錯誤信息)。 – 2011-06-14 14:34:00

4

你需要讓你的運營商一個非成員函數。

+0

+1 Sheesh。由於所有的答案都是錯誤的答案,只有一個答案是正確的,所以我覺得不得不在這裏投票。還有其他所有正確回答此問題的人。 – 2011-06-14 00:26:26

+0

對於爲什麼它不應該是成員函數,我可以有一個很好的解釋嗎?我被教導說,當你想限制它成爲左手邊的「PerfectNum」時是可以的;因爲OP只希望它位於兩個'PerfectNum'對象之間,所以我認爲成員函數是要走的路。 – 2011-06-14 14:32:00

1

運算符+應該是非成員函數。返回類型應該是const對象。如果你有operator = defined,那麼最好還是定義operator + =。所以,你可以用operator + =來實現operator +。

const PerfectNum operator+(const PerfectNum& lhs, const PerfectNum& rhs) 
{ 
    PerfectNum ret(lhs); 
    ret += rhs; 
    return rhs; 
} 
1

當聲明爲類方法時,重載操作符+肯定不應該是朋友/自由函數。這裏有一個非常簡單的實現:

class PerfectNum { 
    public: 
     PerfectNum(int); 
     PerfectNum(const PerfectNum&); 
     PerfectNum operator+(const PerfectNum&) const; 
    private: 
     int mNumber; 
}; 

PerfectNum PerfectNum::operator+(const PerfectNum& rhs) const 
{ 
    return PerfectNum(this->mNumber + rhs.mNumber); 
}