2015년 9월 23일 수요일

[C++] Conversion

변환 연산자는 컴파일러에 의해 암시적 호출이 가능하므로 사용시 유의해야 한다.

대부분의 해외 개발자들은 변환 연산자보다는 변환 인터페이스 사용을 권장하고 있다.
Android에서는 인터페이스와 바인더 사이의 변환을 하기 위해서 아래의 두 함수를 제공한다.
asBinder, asInterface


foo(c); 코드는 개발자의 의도와 달리, 컴파일, 런타임에 에러 없이 동작하고 있다.
Complex의 int() 연산자 재정의를 함으로써 암시적으로 형변환이 되어 에러가 발생하지 않는다.

예를 들어, 다음 코드는

아래와 같은 단계로 형변환이 되어 동작한다.
int real = c;
int real = int(c);
c.operator int();


하지만 많은 대가 들이 operator 를 이용해서 형변환하지 말것을 강조하고 있다.

위의 형변환 문제는 Android framework에서도 동일하게 나타난다.
Framework에서 service 를 개발할 때, IBinder와 IInterface를 둘 다 상속(다중상속)을 받는데,
IInterface 와 IBinder 간에 형변환이 가능해야 하는 구조를 가지고 있다.
그래서 Android에서는 IInterface 에는 asInterface 를 제공하고, IBinder에는 asBinder를 제공하여
서로의 형변환 처럼 동작하도록 제공한다.

위 코드는 아래와 같이 바뀔 수 있다.








댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...