在另一个类

时间:2017-09-25 19:14:44

标签: c++ function-pointers

我查看了以下主题,但它们似乎无法解决问题:

Function pointer to member function - 此线程无效,因为访问是在main而非另一个类

中进行的

one class should invoke method of another class using a function pointer - 我无法遵循接受的答案,因为我不清楚如何使用<functional>标题。

我有一个 U seful F unction类UF,我在其中声明并定义了我的程序的所有常用实用程序函数。其中一个功能是

int UF::compar_dbl_asc(const void *a, const void *b)//comparator for sorting 
{                                                   //array of double in ascending order
    int aa = *((int *)a), bb = *((int *)b);
    if (base_arr_dbl[aa] < base_arr_dbl[bb])
        return -1;
    if (base_arr_dbl[aa] == base_arr_dbl[bb])
        return 0;
    if (base_arr_dbl[aa] > base_arr_dbl[bb])
        return 1;
}

这是一个比较器函数,我打算在qsort()内使用它来按升序对双精度进行排序。

UF类定义中,我还有double* base_arr_dbl;作为声明。这是qsort将使用的值(双精度)数组。

现在,在名为SEP的我的另一个类中,我有一个函数fn1,其中我希望base_arr_dbl指向本地(fn1 )double数组,我想使用qsort中的比较器函数调用UF。虽然可能不需要非常具体,但我不对实际值的数组进行排序,而是对索引数组sortedindices[]进行排序,这样sortedindices[0]将保存最小条目的索引。 base_arr_dbl[]数组。也就是说,排序顺序为base_arr_dbl[sortedindices[0]], base_arr_dbl[sortedindices[1]]等。

所以,我这样做:

void SEP::fn1(UF *uf) {

    double ratio[100];
    //populate ratio's entries
    //Now, sort ratio's entries.
    uf->set_base_arr_dbl(ratio); //This function is defined as
   //void UF::set_base_arr_dbl(double *ptr) { base_arr_dbl = ptr; }
    qsort(sortedindices, 100, sizeof(double), uf->compar_dbl_asc);

}

但是,行qsort(sortedindices, 100, sizeof(double), uf->compar_dbl_asc);会抛出以下编译时错误:

error C3867: 'USEFUL_FUNCTIONS::compar_dbl_asc': non-standard syntax; use '&' to create a pointer to member

我尝试过&uf->compar_dbl_asc,但这会产生错误:

error C2276: '&': illegal operation on bound member function expression

任何有助于解决此问题的方法都表示赞赏。

1 个答案:

答案 0 :(得分:2)

正如编译器在错误消息中明确指出的那样,uf->compar_dbl_asc&(uf->compar_dbl_asc)都不适合用作qsort的参数。

您可以使用compar_dbl_asc作为qsort的参数,使用以下方法之一。

  1. 使compar_dbl_asc成为该类的static成员函数。
  2. 更好的是,为您的应用创建namespace并在compar_dbl_asc中定义namespaceUF可能是namespace,除非出于某些其他原因必须是一个类。
  3. 另一种选择是放弃使用qsort来支持std::sort。后者为您提供更多选择。使用std::sort时,您可以使用仿函数或lambda函数,这样您就可以使用UF::compar_dbl_asc

    std::sort(sortedindices, sortedindices+100,
              [=uf](int a, int b) { return uf->compar_dbl_asc(a, b); });
    

    需要注意的一点是,如果您选择最后一种方法,UF::compar_dbl_asc的签名可以更改为更加用户友好的变体。

    bool UF::compar_dbl_asc(int a, int b)
       return (base_arr_dbl[a] < base_arr_dbl[b]);
    }