2012-03-03 7 views
3

다음은 내 응용 프로그램에서 요구하는 요구 사항입니다. 나는 함수 포인터를 받아들이는 클래스 A를 가지고있다. 기본적으로 A의 구현에서 cFunc를 여러 번 호출해야한다.하나의 함수 포인터가 여러 클래스를 가리킬 수 있습니까? member 함수

cFunc 포인터 자체는 응용 프로그램에 따라 다른 기능을 가리켜 야합니다. 따라서 각각의 애플리케이션에 대해 나는 cFunc와 같은 함수 정의와 클래스를 생성하지만 나는이 같은 것을 확인 어떻게

class A { 
    typedef double (*Def_CFunc)(std::vector<double>); 
    A(Def_CFunc _cFunc) { // Some implementation} 
    // Other Functions 
}; 

class B { double someFunc(std::vector<double> b); }; 
class C { double someOtherFunc(std::vector<double> a); }; 

int main() { 
    B firstObj; 
    C secondObj; 

    // Depending upon the situation, I want to select class B or C 
    double (*funcPointer)(std::vector<double>) = firstObj.someFunc; // Error in this line of code 

    A finalObj(funcPointer); 
} 

그래서이 포인터 클래스의 멤버 함수를 할당 할 수 없습니다의 멤버 함수와 모든 클래스 주어진 형식을 사용하여 클래스 A를 초기화 할 수 있습니까?

+0

멤버 함수가 실제로 필요합니까? – Mat

+0

그러나 실제로는 함수가 클래스 변수와 매우 밀접하게 통합되어 있으므로 이동하는 가장 좋은 방법 인 것 같습니다. – Nicomoto

답변

2

정확히 어떤 요구 사항인지 모르겠지만 interface (또는 C++ 언어의 추상 기본 클래스)을 원하는 것처럼 보입니다. 모두 B 공통 기본 클래스에서 C 상속, 당신이 기본 클래스에 대한 포인터를 전달할 수 있습니다 그것에 함수를 호출

경우

class I { virtual double func(std::vector<double> a) = 0; } 
class B : public I { double func(std::vector<double> a); }; 
class C : public I { double func(std::vector<double> a); }; 

당신은 AI* 포인터를 전달 그냥 i->func을 사용할 수 있습니다 .

+0

나는 당신과 의견을 달리해야합니다. 정적 인 다형성이 필요할 때도 있습니다. – innochenti

+0

@innochenti : 글로벌 기능을 사용하는 것만 큼 좋습니다. OP가 객체 지향적 방식으로 진행 되었기 때문에 인터페이스 만 제안했습니다. – casablanca

1

Pointer to member function은 일반 함수 포인터와 다른 구문을 가지며 주어진 클래스의 메서드 만 가리킬 수 있습니다. 다른 클래스의 메소드를 가리 키려면 boost::function을 사용하거나 C++ 11을 사용할 수있는 경우 std::function을 사용하십시오. 이것들은 주어진 서명의 모든 메소드 나 함수를 포함 할 수 있습니다.

1

회원 함수 포인터가 허용하지 않기 때문에 std::bind 또는 람다 식 (또는 처음 두 개와 동일한 부스트)과 함께 std::function이 필요합니다.

0

std :: bind + std :: function을 사용하여 수행 할 수 있습니다. 정적 유형을 입력으로 사용하는 일부 템플리트 클래스 랩퍼를 작성할 수 있습니다. 그런 다음이 랩퍼를 자유 함수 switch_obj에서 사용하십시오. 사용법은 매우 간단합니다.

typedef std::function<double(std::vector<double>)> my_foo; 

template<class C> 
struct switcher 
{ 
    static my_foo convert(C* obj) 
    { 
     return my_foo(std::bind(&C::someFunc,obj,std::placeholders::_1)); 
    } 
}; 

template<class T> 
my_foo switch_obj(T* obj) 
{ 
    return switcher<T>::convert(obj); 
} 

void main() 
{ 
    B firstObj; 
    C secondObj; 

    auto f = switch_obj(&firstObj); 
    A a(f); 
}