2014-04-17 1 views
6

정수 (정수 이상을 포함) 중 하나와 정수를 비교할 수 있어야합니다. ...C++의 다른 유형에 대한 비교 연산자 오버로딩

다른 유형의 항등 연산자를 어떻게 오버로드합니까?

는 기본적으로 내가이이

struct MyClass { 
    int start; 
    int middle; 
    int threequarters; 
}; 

같은 클래스와 오버로드 된 연산자 그래서

inline bool operator==(const MyClass& lhs, const MyClass& rhs) { 
    return lhs.middle == rhs.middle; 
} 

나뿐만 아니라 중간 변수에 대해 비교해야 정수와 비교,하지만 난 확실하지 않은 경우 두 세트의 연산자 함수가 필요합니다. 정수는 lhs이고 정수는 rhs입니다.

inline bool operator==(const int& lhs, const MyClass& rhs) { 
    return lhs == rhs.middle; 
} 

inline bool operator==(const MyClass& lhs, const int& rhs) { 
    return lhs.middle == rhs; 
} 
+1

예, 그렇게해야합니다 way - support (int, MyClass) 및 (MyClass, int)입니다. 연산자 중 하나를 다른 연산자로 정의 할 수 있습니다.또 다른 가능성은 int에서 생성하는 MyClass의 생성자를 갖는 것입니다. 그러면 컴파일러가 int를 만나면 연산자의 MyClass 유형으로 승격 할 수 있기 때문에 연산자 (MyClass, MyClass) 만 필요합니다. – qeadz

+0

그래서 MyClass와 MyClass를 정수로 비교하고 MyClass와 정수를 비교하려면 대부분의 다른 비교 함수를 참조 할지라도 모든 비교 함수 (총 18 개)가 3 세트 필요합니다. – user3235200

+2

또는 클래스에 변환 생성자 인'MyClass (int i) : middle (i) {}'을 부여하십시오. – juanchopanza

답변

4

내 의견에서 명확히하기 위해,이 코드를 지원합니다). 아니면, 당신은 INT에서 구성하는 생성자를 제공 할 수 있습니다하는 것이 합리적 경우 :

inline bool operator==(const MyClass& lhs, const MyClass& rhs) { 
return lhs.middle == rhs.middle; 
} 

:이 작업을 수행 할 경우, 각 운영자에 대한 MyClass에, MyClass의 버전을하기 만합니다

struct MyClass { 
MyClass() {} // default 
MyClass(int x) { /* init for an int here */ } 
int start; 
int middle; 
int threequarters; 
}; 

을 컴파일러가 볼 때 때문에 :

if (5 == my_class) {} 

를 실제로이 수행합니다

if (MyClass(5).operator==(my_class)) {} 
1

예, 클래스에 int 유형의 객체에 대한 변환 생성자가없는 경우 세 연산자 ==를 정의해야합니다.

inline bool operator==(const MyClass& lhs, const MyClass& rhs) { 
return lhs.middle == rhs.middle; 
} 

inline bool operator==(const int& lhs, const MyClass& rhs) { 
return lhs == rhs.middle; 
} 

inline bool operator==(const MyClass& lhs, const int& rhs) { 
return lhs.middle == rhs; 
} 

그리고 코드의 상당한 양으로 불면있는 (모든 운영자 그렇게 : 당신이 운영자의 모든 변형을 제공 할 수 있습니다 있도록

inline bool operator==(const MyClass& lhs, const MyClass& rhs) { 
    return lhs.middle == rhs.middle; 
} 

inline bool operator==(const MyClass& lhs, int rhs) { 
    return lhs.middle == rhs; 
} 

inline bool operator==(int lhs, const MyClass& rhs) { 
    return operator ==(rhs, lhs); 
} 
+0

그리고 const int & rhs .. .? – user3235200

+1

@ user3235200 아니요 const int &를 사용할 필요가 없습니다. int를 사용하는 것으로 충분합니다. –

0

예, 두 연산자가 필요합니다. 2 == a은 (클래스 A는 인수로 정수을 암시 생성자가없는 점을 고려) : 다음하려고하면

bool operator==(const A& a, const int & b) 
{ 
    return a.value == b; 
}; 

정의에만 위의 연산자를 컴파일러는 어떤 변환을 사용할 수 없다는 오류가 발생합니다

각 바이너리 작업에 대해 컴파일러는 작업에 맞게 암시 적 변환을 시도합니다. 예를 들어 class Aoperator int 정의가있는 경우 컴파일러에서 암시 적으로 A 유형을 정수로 변환 한 다음 bool operator==(int,int) 연산을 수행하므로 연산자가 필요하지 않습니다. 연산자가 정의되어 있지 않으면 컴파일러에서 사용할 수있는 변환이 없다는 오류를 던집니다 (예 : 왼쪽 또는 오른쪽에서 A를 인수로 사용할 수있는 연산자가 없음)