변환 연산자는 컴파일러에 의해 암시적 호출이 가능하므로 사용시 유의해야 한다.
대부분의 해외 개발자들은 변환 연산자보다는 변환 인터페이스 사용을 권장하고 있다.
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를 제공하여
서로의 형변환 처럼 동작하도록 제공한다.
위 코드는 아래와 같이 바뀔 수 있다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
Template specialization : class template 을 arguments에 따라서 customizing 하는 기법 먼저 위 예제의 첫 번째 template 선언처럼 일반적인 template 선언은 primary temp...
-
우리는 함수의 포인터를 사용하여 함수를 또 다른 함수의 인자로 또는 반환 타입으로 사용할 수 있다. 포인터 변수 선언 방법은 어떻게 하는가? 타입 * 변수명; (통상 C++은 type에 *를 붙여쓰고, C개발자는 변수명에 붙여씀) 함수 포인...
댓글 없음:
댓글 쓰기