2012-05-04 9 views
3

구성원 함수를 전역 함수의 매개 변수로 전달하는 방법이 있습니까? this을 찾았지만 문제가 해결되지 않았습니다. F1과 F2는 멤버 함수이며, 기능 2 어딘가에 기능 1 만에서 호출C++ 멤버가 전역 함수의 매개 변수로 사용됩니까?

Function2(&F1, &F2, 0, m_m1, 0, m_m2, &m_n1, &m_n2,0); 

로 기능 2를 호출

double Function(double (*fEval)(double F1, double F2),double min, double max,int numArgs,...); 

bool Function2(double (*fEval1)(double F1, double F2),double (*fEval2)(double F1, double F2),double xmin, double xmax, double ymin, double ymax,double &ax, double &ay,int numArgs,...); 

내 멤버 함수 중 하나를

내가 다음 글로벌 기능을 가지고 말할 수 있습니다 내 문제는 Function2와 함께하고 그것을 올바르게 선언하는 순간입니다. 좋아

는 지금은

bool Function2(double (CLASS::*)(double F1, double F2),double (CLASS::*)(double F1, double F2),double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,int numArgs,...) 

내 함수 선언을 변경 관리했습니다 그리고 내가 클래스로 대체되었습니다 기능 fEval1 및 fEval2 전화려고 할 때 발생 아마 하나의 문제가있다 :: *이 함수 내에서 첫 번째와 두 번째 멤버 함수를 어떻게 호출 할 수 있습니까?

+0

http://www.newty.de/fpt/callback.html#member –

+0

CLASS 형식의 객체'obj '와 CLASS 내부의 멤버 함수'func'에 대한 포인터를 모두 전달해야합니다. 그런 다음'obj. * func()'을 실행하여 객체에 대한 함수를 호출 할 수 있습니다. –

+0

그러나 주 함수의 어딘가에서 내 개체를 만들고이 함수를 다른 함수 내에서 호출하면 선언되지 않은 경우이 함수 호출에서 해당 개체를 호출 할 수 있습니다. O – Mare

답변

4

멤버 함수 포인터는 일반 함수 포인터와 다릅니다. 유형의 일부로 클래스를 지정해야합니다. 또한 호출 할 때 멤버 함수가 호출되는 객체를 지정해야합니다.

귀하의 오류 메시지가 당신이 전달하는 멤버 함수의 종류는 사실 double (CLASS::*)(double, double)에 있음을 보여줍니다 -이

는 C에서보세요 서명에 일반 함수 포인터 유형과 호환되지 않습니다 ++ FAQ 여기에 멤버 함수 포인터를 사용하는 방법에 대한 좀 더 자세한 내용은 : 그것은이 작업을 수행 할 수의 일종의하지만 당신이 정말로 원하는 무엇인지 질문을 많이에 열려

http://www.parashift.com/c++-faq-lite/pointers-to-members.html

4

.

는 멤버 함수에 대한 포인터와 같은 일이있다, 하지만은 그래서 당신은, 멤버 함수 포인터를 모두 제공 을 필요로 그것을 사용하는 등 기본적으로 구조체 내의 오프셋 (offset)의 역할 해당 멤버 함수를 호출 할 객체입니다. 당신이하고있는 일을 감안할 때, 당신이 정말로 이것을 원한다는 것은 (적어도 저에게는) 드뭅니다.

즉각적인 반응은 Function1Function2을 템플릿으로 작성하고 함수에 대한 포인터 대신 펑터를 전달하는 것입니다. 정상적인 멤버 함수를 지정하는 대신, 각각은 다른 펑터와 마찬가지로 수행하고 과부하 operator()을 수행하여 작업을 수행합니다.

편집 : 가능하면 가변적 인 함수를 사용하지 마십시오. C++의 명확한 no-nos 중 하나 인 유형 정보를 버립니다. 특히 C++ 11을 지원하는 새로운 C++ 컴파일러를 사용하면 거의 항상 피할 수 있습니다 (객체를 만드는 이니셜 라이저 목록을 전달할 수 있음).

+0

고마워요! 나는 그것을 들여다 보며 그것을 내 마음 속에 간직 할 것입니다. 이 경우 함수 내에서 경계를 변경해야하기 때문에 arglist를 사용해야 할 것입니다. 나는 이것이 3 가지 또는 4 가지의 함수에 여러 가지 다른 형태의 함수를 쓰는 것보다 더 좋은 방법이라고 생각한다. – Mare

+1

@Mare : 아이디어는'std : vector'와 같은 것을 전달하는 것이 었습니다. 필요한 경우 다른 크기의 벡터를 전달하는 것이 일반적으로 매우 쉽습니다. –

+0

오, 정말 훌륭합니다! 왜 그런 생각을하지 않았는지 나는 모른다. – Mare

관련 문제