2013-06-15 4 views
1

나는 이것으로 약간의 어려움을 겪고있다. 내 개인 프로젝트에이 연산자를 오버로드해야한다고 판단했습니다. 다음 라인을 사용하여 필요합니다 :연산자 오버로드 (==)

플레이어 클래스에는 하나의 특정 데이터 멤버 인 mInitiative를 계산하기위한 여러 데이터 멤버가 있습니다. 이것은 if 조건에서 검사하고 싶은 것입니다. 여기를 오버로드에서 내 시도이다 : 그것은 충분히 잘 보인다

bool operator==(const Player& lhs) const { 
    return mInitiative == lhs.mInitiative; 
} 

,하지만 오류가 지속됩니다. 특정 플레이어 데이터를 정수 (이 경우 0)와 비교하려면 어떻게해야합니까? 내 접근 방식의 실수는 무엇입니까?

는 편집이 : 나는 시도했다 :

bool operator==(const Player& lhs, int rhs) const { 
    //... 
} 

그러나 컴파일러는 함수에 대한 너무 많은 매개 변수가 말했다. 왜 이런거야? 두 가지를 할 수 없어야합니까?

감사합니다.

+0

어떤 오류가 발생 했습니까? – 0x499602D2

+0

클래스 외부의 개체를 직접 수정하지 않는 연산자를 선언하면 훨씬 더 명확 해집니다. – theunamedguy

+0

연산자는'Player' 타입의 오른쪽을 취하지 만'int'를 전달합니다. – 0x499602D2

답변

4

등가 연산자를 오버로드하는 데는 두 가지 방법이 있습니다. 하나의 인수 (rhs)를 사용하여 멤버로 선언하십시오. 또는 두 개의 인수 (lhs 및 rhs)를 사용하여 전역으로 선언 할 수 있습니다. 당신의 좌 때문에 여기를 정의하는 방법은 두 가지가됩니다 Player이며, 당신의 rhs는 정수입니다 : 같은 방법으로 과부하 사업자의 스타일 고려 사항을 제외하고 떠나

// declared inside Player class as a member 
bool operator == (int rhs) const 
{ 
    return mInitiative == rhs; 
} 

// can also be declared inside Player class, but is not a member due to friend keyword 
friend bool operator == (Player const& lhs, int rhs) 
{ 
    return lhs.mInitiative == rhs; 
} 

.

+0

두 경우 모두 대칭을 위해 추가 오버로드를 선언하는 것이 좋습니다 (그렇지 않으면 '0 == player'를 수행 할 수 없습니다). –

+0

회원 운영자는 항상 인수를 rhs로 취급하므로 두 번째 선언으로 만 수행 할 수 있습니다. 게다가, 이것은 클래스가 숫자 형처럼 동작하도록되어 있다면 매우 유용합니다; 다른 경우에는 아마도 연산자를 오버로드하는 것이 전혀 좋은 생각이 아닙니다. – riv

3

평등 연산자 (즉, ==)의 오버로드를 시도 할 때 항상 대상 인스턴스가 실제로 같은지 생각해야합니다.

귀하의 경우 정수 비교에 플레이어를 제공하면 다음 코드를 읽을 때 혼란 스러울 수도 있습니다. 이 포인터가 null인지 여부를 확인 모양 때문에 :

if(playerVec[i] == 0) 

보다는 정수와 비교 == 플레이어의 연산자를 오버로딩, 나는 당신이 선수를 비교할 수있는 GET() 함수를 제공 제안 더 명확하게 정수. 예를 들어 당신이 (. 예를 들어, 정렬)에서 플레이어 벡터를 관리하기 위해 일부 STL과 기능을 사용할 경우

if (playerVec[i].getPlayerID() == 0) 

는, 당신은 두 개의 플레이어 인스턴스 == 또는 > 연산자를 오버로드 할 수 있습니다.

+0

+1 플레이어 ID와 전체 플레이어의 구별을 제안합니다. –

+0

나는 내가하고 싶은 것을 해냈다. 그러나 당신의 제안은 흥미롭고 가독성을 향상시킬 수있다. 그래서 나는 그와 같은 구별을 할 것이다. 감사! –

+0

@Rome_Leader : 분명히 환영합니다. 나는 나의 대답을 편집했으며, 그것이 더 명확하게 보이기를 바란다. – keelar