더북(TheBook)

이 예제 클래스는 RoboMouse의 상태 부분을 따로 저장하고 추적하기 위해 작성한 코드이다.16 우선 초기화할 때 적절한 시점에 InitDataType() 스태틱 함수를 호출해 sDataType 멤버 변수를 초기화해 주어야 한다. 이 함수는 MouseStatus를 나타내는 DataType 인스턴스를 만들고 그 mMemberVariables 목록을 채워준다. 여기서 OffsetOf() 매크로를 우리가 직접 정의하여 각 멤버 변수의 오프셋을 계산하는 데 사용하고 있음을 주목하자(대소문자 유의). C++ 표준 offsetof() 매크로를 쓰면 POD 클래스가 아닌 경우 오동작할 수 있다. 실제로 일부 컴파일러는 클래스에 가상 함수가 정의되거나 POD가 아닌 자료형이 멤버로 포함된 경우에 offsetof()를 쓰면 아예 컴파일 오류를 내기도 한다.17 이 책에서 작성한 매크로는 몇 가지 예외사항을 제외하고는 잘 동작하는데, 예외사항으로 클래스에 &(참조) 단항 연산자를 정의한 경우, 클래스가 가상 클래스를 상속받은 경우, 멤버 변수를 레퍼런스로 갖는 경우에는 동작하지 않는다. 한편으로는 이렇게 리플렉션 데이터를 초기화하는 코드를 손수 작성하는 것보단, C++ 헤더 파일을 분석하는 도구를 써서 여러 클래스의 리플렉션 데이터를 자동 생성하는 것이 이상적일 터이다.

 


 

16  역주 POD 관련 제약사항으로 인해 복잡한 클래스를 처리하기 힘들 때, 이렇게 POD화할 수 있는 부분만 따로 떼어주면 처리하기 편하다.

 

17  역주 정확하게는 자료형이 standard layout을 충족해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.