2011-09-07 9 views
1

C++로 * 연산자를 오버로드해야합니다. 그래서 저는 Element라는 클래스를 만들었습니다.이 클래스는이 opperator에 과부화되어 그 안에 저장된 double 값으로 작업해야합니다. 이것은 구현 파일에서 수행 한 작업입니다.C++로 연산자 오버로딩

#include "Element.h" 
#include <iostream> 

using namespace std; 

// Other code that is not relevant 

Element Element::operator * (const Element &obj) 
{ 
    d *= obj.d; 
    return *this; 
} 

이것은 작동하지 않습니다. 내가 가진 " '운영자 *'에 대한 일치를 주 파일에서 '8 *의 C'

에 :

d = a = 8 * c - 4 + b; 

D, A, C와 b의 모든 객체 곳은 말을하지 않는 오류가 발생합니다 클래스 요소

+2

나는 [연산자 오버로딩 FAQ] (http://stackoverflow.com/q/4421706/46642)를 추천 할 것이다. –

+0

감사합니다. 나는 그것을 검사 할 것입니다. – Tim

+0

8은 '요소'가 아닙니다. 그것은 int로 취급됩니다. 표시하는 코드는 두 개의 '요소'를 곱하는 것을 허용합니다. – erikH

답변

3
당신은 정말 당신이를 위해 '*'연산자를 오버로딩, 여기에서 무엇을하고 있는지 이해해야

요소 c 하지만 다른 요소에는 '매개 변수'가 있다고 기대하면서 그렇게하고 있습니다.

실제로 이러한 종류의 코드를 기대하고 쓴 코드

Element v, w, a; 
a = v * w; 

했나요, 당신이 한 번 봐 걸릴 할 수 있습니다 : 두 Element 개체를 증식 할 수 있습니다 http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/

+0

흠, 그래, learCPP 웹 사이트에서 약간 읽었습니다 .. 거기에 쓰여진 코드 중 일부를 구현하려고합니다 .. 도움을 주셔서 감사합니다 – Tim

1
Element * Element에 대한 연산자 * 과부하 때문에 c * 8 당신이 구현해야 할 것이다 동안의

Element Element::operator * (const int i)

+1

표현식은 8 * c이며 회원 운영자는하지 않습니다. Op는 매개 변수화 된 Element 생성자를 사용하여 전역 연산자 오버로드 및 const 요소 및 참조를 사용해야합니다. –

+0

내 게시물에'c * 8'을 썼음을 알게 될 것입니다. –

0

기존 운영자 구현 함께. 그러나 '주 파일'의 클라이언트 코드에 따르면 Element 객체에 스칼라 값을 곱할 수 있어야합니다. 이 경우 8입니다.

은 그래서 당신이 필요로하는 것은 그것의 매개 변수로 이중 걸리는 추가 연산자 : 같은 뭔가 다음 : 나는 당신의 요소 클래스는 하나의 스칼라 매개 변수를 생성자를 가지고 있다고 가정하고

다음
Element Element::operator * (const double scalar) const 
{ 
    const Element e(d * scalar); 
    return e; 
} 

, d에 할당합니다.

operator *의 기존 구현은 의미가 이상합니다 ( ). d의 내부 상태 (* =)가 변경됩니다. 이것은 당신이 원하는 거의 확실하지 은 ...

1

당신은 당신이 사용할 수있다 const Element&를 사용하여

Element operator* (const Element& leftHandSide, const Element& rightHandSide){ 
    return Element(leftHandSide.d * rightHandSide.d); 
} 

같은 비회원 과부하 8 * C를 표현 (INT, 요소)를 일치시킬 수 있습니다 형식 변환을위한 Element::Element(int)과 같은 서명을 가진 생성자

0

나는 당신에게 해결책을 제시하고 운전자 과부하에 대해 경고합니다.

솔루션 :이도 호출되지 않은 원인

#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); 
    } 
}; 

이런 대답은 시간이 많이 걸리는데 ... 나는 일해야한다 : \

관련 문제