MSVC 컴파일러에서 상속시 발생할 수 있는 this 포인터 문제
Callback 인터페이스를 제공하는 클래스를 디자인하던 중 발생한 this 포인터 문제에 대해서 정리하기 위해서 작성하였음. 빌드 환경은 윈도우 + MSVC컴파일러.
this 포인터의 잘못된 참조
목표는 몇 가지 콜백함수를 등록하고, 특정 상황에 맞게 호출할 수 있는 인터페이스를 제공하는 클래스를 디자인하는 것이다. 여러 방법 중 해당 클래스를 상속하여 인터페이스를 이용하는 방식을 선택하였다.
먼저 상속관계에서 콜백을 호출하는 간단한 테스트를 진행하였고, 그 과정에서 문제를 발견하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class ICallback { protected: typedef void(ICallback::* Callback)();
void CallProc(Callback proc) { (this->*proc)(); } };
class Test : public SomeClasses, public ICallback { int data{ 10 }; public: void RegisterFoo() { CallProc((Callback)&Test::foo); }
void foo() { printf("%d\n", this->data); } };
int main() { Test* t = new Test; t->RegisterFoo(); }
|