我有一個解決方案,併爲您的操作員超載警告。
解決方案:
#include <iostream>
using namespace std;
struct Element {
double d;
Element(double d) {this->d = d;}
Element operator*(const Element &obj) {
d *= obj.d;
return *this;
}
};
Element operator*(const int i, const Element& e) {
return Element(static_cast<double>(i) * e.d);
}
ostream& operator<<(ostream& os, const Element& e) {
os << e.d;
return os;
}
int main() {
Element e(2);
cout << "Product of 8 and e: " << 8*e << '\n';
// This shows why your overload is a bad idea:
Element a(3);
cout << "a is " << a << '\n'; // prints 3
cout << "Now its product with e is: " << a*e << '\n'; // prints 6
cout << "Surprise: a is now " << a << '\n'; // prints 6
}
你原來超載沒有工作,因爲它甚至沒有叫。您的表達是相似的
a = 8*c
其中圖8是int類型的,並且當C++解析從離開這個表達式向右它看到圖8是int類型的,並試圖搜索運算符*的過載(常量元素& )在int類型中,它找不到它,導致它不知道,也不應該知道有關您自己的用戶定義類型的任何信息。所以如果你想讓你自己的類與其他類型進行交互,你需要將operator *的重載作爲成員函數嵌入到其他類型中,或者像我在解決方案中那樣將其聲明爲外部函數。
現在的警告。您的原始運算符重載不明確,導致它修改原始對象,這被認爲是意外行爲。我在上面的代碼中顯示了這一點。這就像乘以2 8會給你16,但在同一時間做16出你8.你真正想要做的是在你的乘法運算符來創建一個新的元素,並將其返回:
struct Element {
double d;
Element(double d) {this->d = d;}
Element operator*(const Element &obj) {
return Element(this->d * obj.d);
}
};
哎呀這些答案需要很多時間...我應該工作,雖然:\
我會推薦[運算符重載常見問題](http://stackoverflow.com/q/4421706/46642)。 –
謝謝我會檢查出來 – Tim
8不是'Element'。它被視爲一個整數。您顯示的代碼只允許兩個「元素」相乘。 – erikH