티스토리 뷰

728x90

타입변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자

유리수가 선 객체일경우 operator를 사용하면 에러가 뜬다.

 

 

문제점

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Rational 
{
public:
    Rational(int num = 0int num1 = 1);
 
    //explicit붙이지 않는 이유는 int에서 Rational로의 암시적 변환을 허용하기위해…
    const Rational operator*(const Rational& rhs ) const;
};
 
void main()
{
    Rational Eighth(18);
    Rational Half(12);
    
    Rational result = Half * Eighth;  // ok
    result = result * Eighth;         // ok
 
    //Rationl을 int와 같은것과 곱하고 싶을 때…
    result = eHalf * 2;             // ok
    result = 2 * eHalf;             // no~
     //2라는 유리수는 Half객체를 모르기 때문에…
 
    result = Half.operator*(2);  // ok
    result = 2.operator * (Half);  // oh~ no~
    // 암시적타입 변환에 대해 매개변수가 먹혀들려면 매개변수 리스트에 들어 있어야 한다.
    // 호출 되는 멤버 함수를 갖고있는(this가 가르키는)객체에 해당하는 암시적 매개변수는 암시적변수가 먹히지않는다
}
 
 
 
 
 
 
 
 
cs

 

 

해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Rational
{
    Rational(int num = 0int num1 = 1);
    {
    }
    const Rational operator*(const Rational& lhs, const Rational& rhs)
    {
        return Rational( lhs.num() * rhs.num()  , lhs. num1() * rhs.num1());
    }
};
void main()
{
    Rational oneFourth(14);
    Rational result;
    Result = oneFourth * 2;  // ok
    Result = 2 * oneFourth;   // ok
    //비멤버는 컴파일러 쪽에서 모든 인자에 대해 암시적 타입 변환을 수행하도록 만듬.
}
cs

 

 

결론

어떤 함수에 들어가는 모든매개변수 (this 포인터나 가르키는 객체도 포함해서)에 대해 타입 변환을 해 줄 필요가 있다면, 그 함수는 비멤버 이어야 합니다.

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
250x250