2014-02-11 1 views
2

C++에서 다른 멤버 함수 (또는 함수 포인터)에 오버로드 된 멤버 함수를 어떻게 할당 할 수 있습니까?멤버 함수를 오버로드로 멤버 함수 포인터에 할당하는 방법은 무엇입니까?

내 목표는 회원 기능을 감싸는 것입니다. 다음 코드가 있고 2 "Do"가 있기 때문에 작동하지 않습니다. 내가하고 싶은 일은 Do1 또는 Do2에서 Do까지를 double * 또는 double **으로 바꾸는 것입니다. 따라서 Do 만 실행할 수 있으며 Do1 또는 Do2을 신경 쓸 필요가 없습니다.

class Sample { 
    int (*Do)(double *arr); 
    int (*Do)(double **arr); 
    int Do1(double *arr); 
    int Do1(double **arr); 
    int Do2(double *arr); 
    int Do2(double **arr); 
}; 

을 (어쩌면, 나는. Do1Do2 사이에서 선택해야하는 조건을 지정한다) 또는 당신은이 목표에 대한 제안 사항이 있습니까?

추가 : Thomas의 경우 함수 객체 (펑터)는 좋은 생각이지만 과부하 만 해결합니다. 기능 (예 : Do1 또는 Do2)을 선택하고 싶습니다. 나는 몇 가지 규정 된 기능을 가지고 있으며 그들 중 하나를 선택할 수 있습니다 Do. 그러나 사용자 정의 기능을 Do에 할당하려고합니다. 예를 들어 Do을 실행하면 Do1, Do2 또는 내 자신의 새로운 사용자 지정된 기능을 실행할 수 있습니다. (인스턴스를 만들 때 어떤 기능이 실행될지를 설정해야합니다.)

.. 내 상황에서는 C++ 11을 사용할 수 없습니다. (내가 원하지만 제 서버에는 더 오래된 GCC 버전이 있습니다)

+2

함수 포인터 대신 함수 개체를 사용해 보셨습니까? –

답변

1

코드가 잘못 작성되어 컴파일되지 않습니다. 함수는 오버로드 할 수 있지만 객체는 오버로드 할 수 없습니다! 즉, 서로 다른 유형의 'Do'라는 두 개의 포인터를 가질 수 없습니다. 나는 완벽하게 기억할 수는 없지만 MSVC는 다음과 같이 말할 것이다 :

'Sample :: Do': 재정의;

class Sample 
{ 
    int Do(double *arr); 
    int Do(double **arr); 
    int Do1(double *arr); 
    int Do1(double **arr); 
    int Do2(double *arr); 
    int Do2(double **arr); 

    void SetDoVersion(int version); 

    int _do_version; 
}; 

과 같을 것이다 '마':

int Sample::Do(double *arr) 
{ 
    //For more than 2-3 versions you could also use switch(). 
    if(this->_do_version == 1) 
    return this->Do1(arr); 
    else 
    return this->Do2(arr); 
} 

int Sample::Do(double **arr) 
{ 
    //same as above 
} 

SetDoVersion() 세트 당신이 그런 짓을하려면 다른 기본 유형

, 당신은 플래그를 사용할 수 있습니다 현재 'installed'버전 :

void Sample::SetDoVersion(int version) 
{ 
    this->_do_version = version; 
} 

이것은 proba입니다. bly는이 작업을위한 가장 간단한 해결책입니다.

+0

내 코드가 버그가 있다는 것을 알고 컴파일러의 메시지가 나타납니다. 당신의 대답은 좋은 선택이 될 것이지만 만약 내가 "Do"에 사용자 정의 된 함수를 추가하고 싶다면이 솔루션은 나에게 적합하지 않을 것입니다. 답변 주셔서 감사합니다. –