类中的C ++回调函数引用非静态函数[duplicate]

问题描述 投票:-2回答:1

我有该代码,想要对其进行修改并将其放在类中,例如MergeSort

将其转换为类后,在initMergeSort的那一行中得到一个错误:

错误:没有匹配项将函数'merge_sort'转换为'void *(](void)'if(pthread_create(&thread,NULL,merge_sort,(void *)NULL)!= 0){

必须调用对非静态函数的引用(可能的调用目标

{Clion识别它* merge_sort})

pthread_create(&thread, NULL, merge_sort,(void *) NULL);
  1. 我想要的方式:

新标题

and the new header:
    class MergeSort {
       private:
       //int *notSortedData;
       int *sortedData{};
       int part = 0;
       void merge(int low, int mid, int high);

       void merge_sort(int low, int high);
       //Problem is here: --v
       void *merge_sort(void *arg);


       public:
       MergeSort(int* notSortedData){
           this->sortedData = notSortedData;
       }
       static const int MAX = 20;
       static const int HALF_OF_MAX = MAX / 2;
       int initMergeSort(/*int *notSortedData*/);
};

旧标题:

    static const int MAX = 20 ;
    static const int HALF_OF_MAX = MAX / 2;

    void merge(int low, int mid, int high);
    void merge_sort(int low, int high);
    void *merge_sort(void *arg);
    int initMergeSort(int *notSortedData);
  1. 旧的实现:
    // array of size MAX
    int *a;
    int part;
    void merge(int low, int mid, int high) {(...)}

// merge sort function

    void merge_sort(int low, int high) {
        // calculating mid point of array
        (...)
          // calling first half
          merge_sort(low, mid);
          // calling second half
          merge_sort(mid + 1, high);
          // merging the two halves
          merge(low, mid, high);
    }
}

//用于多线程的线程功能,在这里

---------------------- v

    void *merge_sort(void *arg) {
    // which part out of 4 parts
    int thread_part = part++;

    // calculating low and high
    int low = thread_part * (MAX / 4);
    int high = (thread_part + 1) * (MAX / 4) - 1;

    // evaluating mid point
    int mid = low + (high - low) / 2;
    if (low < high) {
        merge_sort(low, mid);
        merge_sort(mid + 1, high);
        merge(low, mid, high);
    }
}

// merge function for merging two parts

    int initMergeSort(int *notSortedData) {
    a = notSortedData;
    (...)
    pthread_t threads[THREAD_MAX];

    // creating 4 threads Here I have to invoke function call merge_sort
    for (unsigned long &thread : threads) {
        pthread_create(&thread, NULL, merge_sort,
                       (void *) NULL);
    }
    // joining all 4 threads
    (...)
    // merging the final 4 parts
    merge(0, (HALF_OF_MAX - 1) / 2, HALF_OF_MAX - 1);
    (...) 
}

先谢谢您

完整的旧代码是here,而我重构失败后的完整代码是here

c++ callback
1个回答
0
投票
您不能对pthread回调使用非静态类方法。有一个隐藏的this参数,pthread无法解决。您需要使用静态方法(或非成员函数)代替,例如:
© www.soinside.com 2019 - 2024. All rights reserved.