2016-03-21 120 views
1

我目前正在編寫一個程序來模擬盒子中的氣體。但是我遇到了班主任的問題。不幸的是,讓煩人的事情被稱爲Vector,我知道有些人不喜歡它被稱爲這個。非成員函數操作符+(...)不能有cv-限定符

Vector.h

class Vector { 
private: 

double x; 
double y; 
double z; 

public: 

Vector & operator+=(const Vector & v){ 
    x += v.x; 
    y += v.y; 
    z += v.z; 
    return *this; 
} 

我已經editted上面的代碼,使這個問題更加清晰。因爲他們不影響問題,所以我省去了施工人員等。

而對於的.cpp

Vector.cpp

Vector operator+(const Vector v) const{ 
Vector v2(*this); 
v2+=v; 
return v2; 
} 

而他yeilds錯誤:

C:\用戶\ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:95: 34:error:非成員函數'Vector operator +(Vector)'不能有cv-qualifier

C:\ Users \ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:函數'Vector operator +(Vector)' :

任何幫助非常感謝。

+0

@BarryTheHatchet我把這個問題解釋爲一個錯字(只是缺少聲明符)。鑑於它實際上是完全不同的功能,顯然不是這種情況...... – Barry

回答

2

錯誤告訴你什麼是錯的。您創建了這些非成員函數,但它們應該是成員函數。編譯器通過(正確)使用const來檢測問題,雖然缺少參數的數量,並且一旦第一個被修復,這將是一個進一步的編譯錯誤。

您忘了將這些函數定義放在class Vector { ... };區域內,或者您忘記在operator之前寫入Vector::

+1

'operator +'當然**不應該是一個成員函數。我覺得這個答案令人困惑。 – SergeyA

+1

你爲什麼說'operator +'不應該是一個成員函數?這可能是... –

+0

@SergeyA:這是你的意見。這不是事實。我堅持_事實_。 –

1

只有成員函數可以有const說明符。兩個操作符都是非成員函數(因爲它們缺少類名稱作爲其簽名的一部分),並且沒有在類定義中定義。

因此,您有編譯錯誤。

要修正這個錯誤,你需要operator+轉化爲一個自由的功能:從您的Vector類中刪除它的聲明,並改變它的sigature到(最簡單的形式):

Vector operator+ (const Vector& lhs, const Vector& rhs); 

有使用某種原因不同的簽名,並接受第一個參數的價值,但這對你的關卡來說太深了,所以我建議現在堅持const參考。

1

感謝您的其他投入,兩者對他們都有好處。我發現我自己的答案是基於Barry @BarryTheHatchet給出的答案。和其他來源。 爲了解決這個問題,讓我感動的頭文件中定義的公共部分,給我:

Vector & operator+=(const Vector & v){ 
    x += v.x; 
    y += v.y; 
    z += v.z; 
    return *this; 
} 

Vector operator+(const Vector v) const { 
    Vector VecPlus(*this); 
    VecPlus.x += v.x; 
    VecPlus.y += v.y; 
    VecPlus.z += v.z; 
    return VecPlus; 
} 

這是結果,我希望它是編寫它一個合法的方式,而不是shody辦法這樣做,但會導致後來的問題。我已經在我的項目中取得了進展,迄今爲止沒有提出任何建議。

+0

在第二個函數中,如果您使參數非''constst',那麼您可以直接使用'v'並避免創建'VecPlus',它目前是一個超額副本。 –