2014-11-20 2 views
0

동일한 서명을 가진 3 개의 함수가 있습니다. 함수 포인터를 사용하여 배열을 초기화해야합니다. 내가 가진 :함수에 대한 포인터 배열 C++

typedef void(*sorting_func) (int* a, int n); 

과 기능 :

class Sortings { 
public: 
    static void bubble_sort(int a[], int n); 
    static void bubble_aiverson_1(int a[], int n); 
    static void bubble_aiverson_2(int a[], int n); 
}; 

I는 다음과 같이 사용하는이 클래스의 포인터와 배열이 필요합니다

Sortings::array[0]... 

기능은 정적이지 될 수 있습니다.

+0

거의 완료되었습니다. 어떤 특정 문제가 있습니까? – vz0

+0

정적 함수가 없다면 정렬 함수의 타입은'void (Sortings :: *) (int *, int);'입니다. 여러분의 필요에 따라,'std :: function'도 옵션이 될 수 있습니다. – chris

+0

정적 멤버 함수가 아닌 멤버 함수가 필요하면 원하는 서명이 없습니다. 그러나 그 서명이 필요하지 않을 수도 있습니다. sortings 객체에 멤버에 대한 포인터의 정적 배열을 가질 수 있습니다. 그래서 some_instance_of_Sortings 할 수 있습니다. * Sortings :: array [i] (some_int_ptr, size); 더 나은 점은 operator []가 훨씬 많은 구문 론적 설탕으로 위를 수행하도록 정의 할 수 있다는 것입니다. – Mike

답변

2

당신은 즉

std::vector<std::function(void(int*,int)>> sortingFunctions; 

그런 다음, 경우에 따라 직접 다시 무료 기능을 밀 수하는 vectorstd::function의 사용, 또는 멤버 함수를 다음과 같은 방법으로 다시 밀어 람다를 사용할 수 있습니다

//Capturing `this` in the lambda implies the vector is a member of the class 
//Otherwise, you must capture an instance of the class you want to call the 
//function on. 
std::function<void(int*,int)> myMemberFunction = [this](int* a, int n){ 
    this->memberFunction(a,n); 
} 

sortingFunctions.push_back (myMemberFunction);

Sorting 클래스의 멤버 함수로 벡터를 생성한다고 가정합니다.

See a live example here

+0

Xcode에 오류가 있습니다 : '아키텍처에 대한 정의되지 않은 기호 x86_64 : 참조 : Sortings :: bubble_sort (int *, int))에서 참조 :: operator() (int *, int) const"Sortings :: bubble_aiverson_1 (int *, int)"참조 된 : Sortings :: Sortings() :: 'lambda' main.o의 operator() (int *, int) const ld : 아키텍처 x86_64에 대한 심볼이 없습니다. clang : 오류 : 링커 명령이 종료 코드 1로 실패했습니다 (호출을 보려면 -v 사용) ' – Vladislav

+0

아마도 당신의 함수를 구현하는 것을 잊어 버렸을 것입니다 ... 일반적인 프로그래밍 문제를 해결하고이 특정 주제 (함수 배열)와 관련된 문제로 되돌아 가십시오. – JBL

+0

JBL, 정말 고마워. – Vladislav