전혀 다른 클래스의 함수로 함수 포인터를 매개변수로 전달하는 법?
글쓴이: wltjd666 / 작성시간: 목, 2017/06/01 - 9:22오후
2개의 해더파일과 2개의 소스파일이 있는데요, 최대한 요약하자면 ....
//------------MyClass.h------------ #include <iostream> class MyClass { private: int n_X; int n_Y; public: void MyFunc1(int *x, int *y); void MyFunc2(int x, int y); }; //--------------------------------- //-------------Master.h------------ #include <iostream> class Master { private: void(*m_Func1)(int *x, int *y); void(*m_Func2)(int x, int y); public: void SetFunc( void(*p_Func1)(int *x, int *y), void(*p_Func2)(int x, int y)); }; //--------------------------------- //-----------Function.cpp---------- #include <iostream> #include "MyClass.h" #include "Master.h" void Master::SetFunc( void(*p_Func1)(int *x, int *y), void(*p_Func2)(int x, int y)) { m_Func1 = p_Func1; m_Func2 = p_Func2; } void MyClass::MyFunc1(int *x, int *y) { n_X = x; n_Y = y; } void MyClass::MyFunc2(int x, int y) { n_X = x; n_Y = y; } //--------------------------------- //--------------Main.cpp----------- #include <iostream> #include "Master.h" #include "MyClass.h" int main() { Master *master = new Master(); MyClass *mclass = new MyClass(); master->SetFunc( mclass->MyFunc1, mclass->MyFunc2); delete master; delete mclass; return 0; } //---------------------------------
master->SetFunc(...) 이 부분에서 오류가 납니다. &를 사용해서 멤버 포인터를 만들라는데..
무슨 소린가요?
Forums:
#1
#1
mclass->MyFunc1를 저장할 함수 포인터는 void (MyClass*)::(p_Func1)(int, int) 와 같이 써줘야합니다. void(p_Func1)(int *x, int *y) 가 아니구요. 생각해보세요. 멤버 함수는 this 포인터를 보이지 않는 인자로 가지고 있습니다. 그렇지 않으면 제대로 작동할 리가 없지요. 함수 포인터의 타입에도 이 사실이 반영되어야겠지요. 따라서 멤버 함수가 보통 함수와 타입이 같은 수는 없습니다. (MyClass*) 부분이 이게 어느 클래스의 멤버 함수인지를 알려주는 부분입니다. 즉 this 포인터에 해당하는 암묵적인 인자의 타입을 써주는 겁니다.
#2
그리고 멤버 함수만 저장해서는 아무것도 할 수 없습니다. this 포인터에 해당하는 데이터가 있어야지만 저장한 멤버 함수를 호출할 수 있겠지요. 예를 들어 SetFunc 가 mclass 를 같이 받아서 저장하거나 해야합니다. 뭐 꼭 그게 아니더라도 여하튼 m_Func1 이나 m_Func2 를 호출하기 위해서는 반드시 MyClass 타입의 객체가 필요합니다.
#3
참고. https://isocpp.org/wiki/faq/pointers-to-members
그러면
그럼 MyClass의 내용을 전부 Master 클래스로 옮겨서 하나의 클래스로 쓰는 방법으로 하면 가능한가요?
질문이 무슨 뜻인지 모르겠군요.
질문이 무슨 뜻인지 모르겠군요.
MyClass를 없애고
MyClass 클래스 자체를 없애고 그냥 Master 클래스로 통합하여,
master->SetFunc(master->MyFunc1,master->MyFunc2);
로 쓰는 겁니다.
무엇 때문에 그렇게 하지요? 앞서 말씀드렸듯이 멤버
무엇 때문에 그렇게 하지요? 앞서 말씀드렸듯이 멤버 함수 포인터를 저장할 타입을 정확하게 써주고 MyClass 타입의 객체를 같이 저장하면 되는 일입니다. 처음에 MyClass와 Master를 다른 클래스로 디자인한 이유가 있을텐데 별다른 이유도 없이 그 둘을 합칠 필요가 없지요.
염치없지만..
계속 물어봐서 죄송한데요. 잘 이해가 안되서요..
Main.cpp, Function.cpp, MyClass.h, Master.h에서 어떤 함수를 건드려야 하는 건가요?
#include <iostream>
잘 살펴보세요. 본인 코드에 응용하실 수 있을겁니다. 그리고 글을 작성할 때에 <code> </code> 대신 <cpp> </cpp> 를 쓰면 C++ 문법에 맞춰 구문 강조를 해주니 더 보기 좋습니다.
댓글 달기