2014-11-10 1 views
2

, 우리는이 클래스가 :C++ 양방향 운영자가 가능합니까? 예를 들어

class my_class 
{ 
public: 
    friend my_class operator* (const my_class&, int a); 
    friend my_class operator* (int a, my_class&); 
}; 

my_class operator* (int a, my_class&) 
{ 
    // do my_class * a 
} 

my_class operator* (int a, my_class&) 
{ 
    // do a * my_class 
} 

는이 두 가지가해야 할 일을 한 운영자 *을 할 수 있습니까?

감사합니다.

+1

두 번째 형식이'my_class'를 반환하면 안됩니까? –

+0

첫 번째 함수는'my_class * a'를 수행 할 수 있지만 첫 번째 함수는 멤버 함수 인 경우에는 'my_class * my_class' 만 수행하고 그렇지 않으면 전역 연산자 함수에 두 개의 인수가 필요하기 때문에 컴파일러 오류가 발생합니다. – 0x499602D2

+0

실제로 의도 한 의미는 무엇입니까? 곱셈, 역 참조? –

답변

6

당신은 그렇게 할 수 없습니다. 그러나, 당신은 하나를 구현할 수 있습니다 단순히 다른 하나에서 호출 :..

my_class operator *(const my_class &l, int r) { 
    // implement the actual operator here. 
} 

my_class operator *(int l, const my_class &r) { 
    return r * l; 
} 

(당신이 클래스의 일부로서 후자의 기능을 구현할 수 없습니다 당신은 외부에서 그것을해야 할 첫 번째 함수가 구현 될 수있다 인스턴스 방법으로, 첫 번째 인자는 클래스 타입이기 때문에)

+0

고마워, 이건 내게 많이 도움이 될거야! – marquesm91

1

당신은 다른를 사용하여 하나를 구현할 수 있습니다.

my_class operator*(int lhs, const my_class& rhs) 
{ 
    return rhs * lhs; 
} 

작업 자체가 교환 법칙이 성립 경우. 항상 그런 것은 아니므로주의하십시오.

특정 운영자를 돕기위한 라이브러리도 있습니다. 당신이

my_class mc, a, b; 
a = mc * 1; 
b = 1 * mc; 

이 있다면 당신은 아마 또한 당신은

my_class& my_class::operator*=(int v); 

을 구현하고 생성 Boost.Operators 또는 df.operators를 사용할 수있는 경우

mc *= 1; 

처럼 뭔가를 할 수 있도록하려면 다른 운영자는 자동으로

예 :이 예에서

struct my_class 
    : df::commutative_multipliable< my_class, int > 
{ 
    // ... 

    my_class& operator*=(int v) 
    { 
     // ... implement me! 
     return this; 
    } 

    // ... 
}; 

은 다시에만 하나 작업을 구현하고 나머지는 공통 스키마를 사용하여 생성됩니다.