나는 당신에게 해결책을 제시하고 운전자 과부하에 대해 경고합니다.
솔루션 :이도 호출되지 않은 원인
이
#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
}
원래 과부하, 작동하지 않았다.귀하의 표현은 8 C++가 8이 int 유형의 것을보고 운영자 *의 과부하를 검색하려고 왼쪽에서 오른쪽으로이 표현을 구문 분석 (CONST 요소 & int 형이며
a = 8*c
에 유사했다) int 형식으로 및 찾을 수없는, 알 수 없으며 사용자 정의 형식에 대해 알고 있어야합니다. 따라서 자신의 클래스가 다른 유형과 상호 작용하기를 원한다면 연산자 *의 오버로드를 멤버 함수로 다른 유형으로 포함 시키거나 내 솔루션에서와 같이 외부 함수로 선언해야합니다.
이제 경고입니다. 원래 운영자 과부하가 잘못 정의되어 원래 개체를 수정하기 때문에 예기치 않은 동작으로 간주됩니다. 위의 코드에서이를 보여줍니다. 그것은 당신에게 16 줄 것 2 8을 곱한처럼, 그러나 동시에 당신이 정말로 원하는 것은 당신의 곱셈 연산자에 새로운 요소를 생성하고 반환하는 것입니다 8에서 16합니다
struct Element {
double d;
Element(double d) {this->d = d;}
Element operator*(const Element &obj) {
return Element(this->d * obj.d);
}
};
이런 대답은 시간이 많이 걸리는데 ... 나는 일해야한다 : \
나는 [연산자 오버로딩 FAQ] (http://stackoverflow.com/q/4421706/46642)를 추천 할 것이다. –
감사합니다. 나는 그것을 검사 할 것입니다. – Tim
8은 '요소'가 아닙니다. 그것은 int로 취급됩니다. 표시하는 코드는 두 개의 '요소'를 곱하는 것을 허용합니다. – erikH