2014-03-06 24 views
0

我只是想知道是否有人可以指出我遇到的問題。在C++中添加兩個對象(操作符重載)

我有三個文件:main.cpp中/ Fraction.cpp/Fraction.h

下面是相關Fraction.h(類)的信息:

class Fraction{ 


//Variables 

    int numerator; 
    int denominator; 

}; 

的main.cpp中裏面,我聲明一些對象:

Fraction left, right, result, ref; 

,然後嘗試將其添加在一起:

result = left + right; 

所以後來我Fraction.cpp文件中(我知道它不是哪裏它應該是)我的操作符重載函數:

Fraction& operator+(const Fraction& l, const Fraction& r){ 

Fraction sum; 

int numSum, denSum; 

numSum = l.numerator2() + r.numerator2(); // these functions get the values 

denSum = l.denominator2() + r.denominator2(); // these functions get the values 

sum.set(numSum, denSum); 

return sum; 

} 

出現以下錯誤告訴我,沒有功能的主要的表達式匹配:

w6.cpp:29:20: error: invalid operands to binary expression ('Fraction' and 'Fraction') 
result = left + right; 

有沒有人有任何想法,爲什麼發生這種情況?謝謝!

+1

你有一個[叼着參考](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside - 它的範圍的)。無論如何,你使用過之前是否聲明過'main.cpp'可以看到的重載? – chris

+0

知道了!我非常愚蠢:P。 – suitegamer

回答

1

你必須在declare過載的頭文件和define它在cpp文件中。例:

MyHeader.h:

Fraction& operator+(const Fraction& l, const Fraction& r); 

MYFILE.CPP:

Fraction& operator+(const Fraction& l, const Fraction& r){ 
// ... 
+0

哦,我的天哪,我在那裏,但我想它沒有妥善保存。崇高的文字試圖將其保存到我沒有寫入權限的HDD上的某個區域。哇。非常感謝你! :P – suitegamer

0

我覺得編譯器不知道你超載+運營商。您需要在您的(Fraction.h)頭文件中聲明它:

Fraction& operator+(const Fraction& l, const Fraction& r); 
0

看起來有兩個問題。帶main的文件確實看到了操作員的聲明。你必須在頭文件中包含聲明。 第二個問題是操作員定義不正確。它具有未定義的行爲,因爲您返回對本地對象的引用。

更改它通過以下方式

const Fraction operator+(const Fraction& l, const Fraction& r){ 

    return Fraction( l.numerator2() + r.numerator2(), l.denominator2() + r.denominator2()); 
} 
+0

@suitegamer閱讀我的文章,因爲它顯示瞭如何正確定義操作符。 –

+0

我會說在返回類型上沒有const,並且它圍繞'operator + ='環繞是比較常見和慣用的。 – chris

+0

@chris實際上這個類模擬算術類型。因此,我更願意使用const,不會有任何可能性爲表達式賦值 –