본문 바로가기

문제 해결

<문제점> 헤더 파일 내의 정적 멤버 함수에서 다른 클래스의 함수 사용하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T>
    static T* CreateObj(const string& strTag, class CLayer* pLayer = NULL)
    {
        T* pObj = new T;
 
        if (!pObj->Init())
        {
            SAFE_RELEASE(pObj);
            return NULL;
        }
        if (pLayer)
        {
            pLayer->AddObject(pObj);
        }
 
        pObj->AddRef();
        return pObj;
    }
cs


컴파일을 하게 되면 위의 코드의 13번째 줄에 2039 오류 ) 'AddObject': 'CLayer'의 멤버가 아닙니다 오류가 뜨게 된다.


pLayer는 CLayer로 선언되었기 때문에 CLayer의 멤버 함수인 AddObject를 사용할 수 있따고 생각했지만, 현재 위 코드는 CObj 클래스로,


Layer.h가 include되어 있지 않기 때문에 인식하지 못하는 것으로 보였다.


헤더 간의 include는 좋지 않고, static, template 때문에, 선언부와 구현부를 나누지 못하고 선언부에 함수 내용까지 모두 구현해야 한다.


https://mufflemumble.tistory.com/13    ( 선언부와 구현부를 분리할 때 주의해야 할 것들 정리 )    참고 >


어떻게 해야하나 싶은 도중,  아래와 같이 AddObject에 CLayer::를 붙여보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename T>
    static T* CreateObj(const string& strTag, class CLayer* pLayer = NULL)
    {
        T* pObj = new T;
 
        if (!pObj->Init())
        {
            SAFE_RELEASE(pObj);
            return NULL;
        }
        if (pLayer)
        {
            // CLayer::를 해주지 않을 시 2039 오류
            pLayer->CLayer::AddObject(pObj);
        }
 
        pObj->AddRef();
        return pObj;
    }
cs


컴파일도 되며, 실행했을 때 정상 작동하는 것까지 확인했다.


하지만 이는 임시방편식으로 된 것이고, 내가 완벽히 이해한 채로 사용한 코드가 아니므로 다른 문제가 발생할 수 있다.




문제점이 발생하거나, 혹은 이 방식이 맞다는 정보를 얻게 되면 글을 수정해야겠다.