2010-03-03 6 views
1

내가 INT 주위의 래퍼 클래스 (지금은) 매우 간단한을 개발하기 위해 노력하고있어, 다음과 같이 달성하기 위해 = 연산자를 오버로드 기대했다 :C++ 래퍼 = 연산자

class IntWrapper 
{ 
    ... 
    private: 
     int val; 
} 

int main () 
{ 
    IntWrapper a; 
    int b; 

    a = 5; // uses overloaded = to implement setter 
    b = a; // uses overloaded = to implement getter 
} 

그러나 나는 이것을 할 수 없다는 것을 모았습니다. 세터를 구현하는 것은 매우 간단합니다, 뭔가 같은 :

class IntWrapper 
{ 
    ... 
    IntWrapper& operator = (int rhs) { this.val = rhs; return *this; } 
    ... 
} 

그러나, 나는 수집하고있어 인터넷 검색의 비트에서이 방법으로 게터을 할 수있는 방법은 없습니다. 우리가 이해할 수있는 것은 = 연산자가 을 변수에 할당하기 위해서만 재정의 될 수 있고, 은 기본 구현 인 =을 무시할 수 없기 때문입니다. 이 올바른지? 그렇지 않다면 어떻게 getter를 작성해야합니까?

그게 맞을 경우 누구에게도 비슷한 비슷한 제안이 있습니까? 그 꽤 의미가 보이지만 간단한 GETVAL() 방법보다 자사의 거의 더 나은로, 나에게

class IntWrapper 
{ 
    ... 
    operator int() { return this.val; } 
    ... 
} 

int main () 
{ 
    ... 
    b = (int) a; 
    ... 
} 

: 내가 찾을 수있는 가장 가까운이 변환 연산자를 오버로딩이다.

의견을 보내 주셔서 감사합니다.

답변

4

변환 기능을 호출하기 위해 캐스트가 필요하지 않습니다. 평야

b = a; 

도 호출합니다. 그렇게하면 getVal 함수보다 사용하는 것이 더 편리하다는 것을 알 수 있습니다. 비록 내가 일반적으로 변환 기능을 사용하지는 않지만. 나는 명시적인 getVal 함수를 선호한다. 특히이 당신이 제안하는 길을 가야하는 하나

struct W { 
    W(int); 
    operator int(); 
}; 

int main() { 
    W w = 42; 
    int a = true ? 0 : w; // Ambiguity! What conversion direction? 
} 

신속 손에서 도착 ...

1

고려, 나는 그 모든 시간을 사용합니다. a를 int로 형변환 할 필요는 없습니다. 컴파일러는 b가 int임을 알만큼 똑똑하고 자동으로 연산자 int cast 연산자를 호출합니다.