함수 포인터 배열 질문입니다.
글쓴이: nayana / 작성시간: 수, 2004/07/21 - 2:47오후
abc.h 파일
1 #ifndef ABC_H 2 #define ABC_H 3 4 class abc 5 { 6 public : 7 abc(); 8 ~abc(); 9 void function1( int ); 10 void function2( int ); 11 void function3( int ); 12 }; 13 14 #endif
abc.cpp
1 #include <iostream> 2 3 using std::endl; 4 using std::cout; 5 6 #include "abc.h" 7 8 abc::abc() 9 { 10 11 } 12 13 abc::~abc() 14 { 15 16 } 17 18 void abc::function1( int a ) 19 { 20 cout << "nayana1 " << a << endl; 21 } 22 23 void abc::function2( int b ) 24 { 25 cout << "nayana2 " << b << endl; 26 } 27 28 void abc::function3( int c ) 29 { 30 cout << "nayana3 " << c << endl; 31 }
fig.cpp
1 #include <iostream> 2 3 using std::cout; 4 using std::cin; 5 using std::endl; 6 7 #include "abc.h" 8 9 int main ( void ) 10 { 11 abc nayana; 12 13 void ( *f[ 3 ] )( int ) = { nayana.function1, nayana.function2, nayana.function3 }; 14 15 int choice; 16 17 cout << " 0 1 2 만 누를세요?"; 18 cin >> choice; 19 cin.ignore(); 20 21 while ( choice >= 0 && choice < 3 ) 22 { 23 ( *f[ choice ] )( choice ); 24 25 cout << " 0 1 2 만 누를세요?"; 26 cin >> choice; 27 cin.ignore(); 28 } 29 30 cout << "end" << endl; 31 32 return 0; 33 }
이런식으로 함수 포인터 배열을 구현 하였습니다.
다음과 같은 에러가 떨어집니다.
fig.cpp: In function `int main()': fig.cpp:13: no matches converting function `function1' to type `void (*)(int)' abc.h:9: candidates are: void abc::function1(int)
함수로 할때는 함수이름만 배열에 집어 넣으면...잘돼던데..
메소드를 함수포인터 배열에 집어 넣을려면 어떻게 해야하나요?
Forums:
Re: 함수 포인터 배열 질문입니다.
일반 멤버 함수와 static 멤버 함수의 경우를 구분해야 합니다.
일반 멤버 함수는 일반 함수에 비해 this 포인터 하나를 더 받기 때문에, 일반 함수 포인터에 일반 멤버 함수 포인터를 대입하는 것은 불가능합니다. 반면 static 멤버 함수는 this 포인터를 받지 않기 때문에, 일반 함수 포인터에 static 멤버 함수 포인터를 대입할 수는 있습니다.
제시하신 소스에서는 function1 ~ function3 모두가 this 포인터를 전혀 필요로 하지 않으므로, 이들이 static 멤버 함수이더라도 전혀 지장이 없지요. 즉 수정을 가장 적게 하면서 제대로 컴파일되도록 하는 방법은 abc::function1 ~ abc::function3 의 선언 부분을 다음과 같이 고쳐쓰는 것입니다.
그러나 만일 이들을 static 멤버 함수로 만들 수 없다면, 이 방법을 사용할 수 없으므로 일반 함수 포인터 대신에 멤버 함수 포인터를 사용해야 합니다. 불행히도 멤버 함수 포인터는 일반 함수 포인터에 비해 문법이 조금 더(!) 까다롭습니다. fig.cpp 를 다음과 같이 수정해야 하지요.
여유가 되신다면, http://www.function-pointer.org 에서 C/C++ 에서의 일반 함수 포인터, 멤버 함수 포인터 및 함수자 functor 까지 다루고 있으니 한 번 살펴보시는 것도 좋을 듯합니다.
댓글 달기