우선
수치형 타입 이란?
기본자료형인 char long int float double  을 말한다.

포인터형 타입이란?
char* long * .. 등등

이유
1. 오버로딩 시 그 모호성이 생길 가능성이 충분하다.
(여기서 모호성은 ... VC2005 표기된 말을 그대로 인용한것으로 개인적 생각에 써 두겠다)

2. NULL 포인터와 수치형 타입의 0에 대해서 .. 매우 불확실하다.
(사람의 눈으로.. 사실 0은 int형 으로 파악되고 FLASE 로 파악된다. 그것이 NULL 포인터라 할지라도)

해결 방법
1. 0이런 무엇인가? 란 답을 가지고 있어야 한다.
2. 수치오버로딩 시 오버로딩이 되는 매개변수의 변화에 대해서 생각해 두어야 한다.
3. 포인터형일 때는 다음과 같은 임시객체를 만들어 사용 해라.

const
class
{
public:
    template<calss T>
    operator T*() const {return 0;}    // 일반객체형의 포인터일때는 0으로 반환해라.
    template<class C, class T>
    operator T C::*() const {return 0;} // 사용자정의객체형의 포인터일때는 그 형의 0으로 반환해라
private:
    void operator&() const;                // 내 자신의 객체의 주소는 아무것도 반환하지 마라
} Null;



위의 클래스가 어떤 클래스이고 어떻게 사용되는지 파악해야지만 속편한 작업이 가능해 진다.


개인적인 생각
1. 클래스 이름이 없으면 속 편하다.(가끔 이름지을때 모든 영어사전을 찾는 작업이 없어지니까)
- 그렇다고 모든 클래스의 이름이 없으면 안된다. 단지 이 클래스의 역활은 단 1개의 객체만 있으면 되니까 이렇게 쓰는것이다.

2. 위의 코드는 .. 모든 기본형 포인터 형변환 연산자의 오버로딩과 클래스형 포인터 형변환 연산자의 오버로딩이다.
- 역시 세상엔 영리한 사람이 많아야 한다. 그래야 주변 사람도 영리해 질수 있기 때문이다!

3. 모호성이란?
어느날 코딩하고 있는데 문득 모호성 에러가 검출되 컴파일이 안되었던 때가 있었다.
그것이 바로 수치형 오버로딩중에 생긴 문제다.
그 때부터 나는 모호성이란 단어를 쓴다. 모호성 = 오버로딩 이란 식이 생긴다.

모호성은 오버로딩말고도 여러가지가 있다. 그 대표적인 것은
1. 클래스 상속간의 메소드 이름 중복
2. 오버로딩시 매개변수의 모호성
3. 두 클래스 같의 연산시 전달받고 리턴하는 타입의 모호성
4. 레퍼런스 모호성

등등등 있는것으로 나는 생각한다..

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요