在另一个类的函数中使用一个类的函数指针

Posted

技术标签:

【中文标题】在另一个类的函数中使用一个类的函数指针【英文标题】:Using a function pointer from one class in a function of another class 【发布时间】:2017-09-25 19:14:44 【问题描述】:

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

Function pointer to member function - 这个线程没有帮助,因为访问是在 main 而不是另一个类中进行的

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

我有一个 Useful Function 类 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)双数组,我想使用UF 中的比较器函数调用qsort。具体来说,虽然这可能不是必需的,但我不对实际值的数组进行排序,而是对索引数组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-&gt;compar_dbl_asc); 行会引发以下编译时错误:

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

我尝试使用 &amp;uf-&gt;compar_dbl_asc 但这给出了错误:

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

感谢任何帮助解决此问题的方法。

【问题讨论】:

“我有一个有用的函数类,UF,我在其中为我的程序声明并定义了所有常见的实用函数”这听起来像一个可怕的设计 为什么不用命名空间呢?你的实用程序函数需要状态吗? 否则,这些实用函数不能在类中使用static,这样您就不需要实例了吗? @AndyG 我不知道函数需要状态意味着什么。你能详细说明一下吗?另外,这是否有助于解决这个函数指针问题? @Tryer:我的意思是成员变量。 UF 是否有成员变量,如果有,为什么?似乎您有一个应该首先解决的设计问题。我们可以帮助您编写理论上适用于这种设计的代码,但它会鼓励不良的设计原则。 【参考方案1】:

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

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

    使compar_dbl_asc成为类的static成员函数。 更好的是,为您的应用创建一个namespace,并在namespace 中定义compar_dbl_ascUF 可能是 namespace,除非出于其他原因它必须是一个类。

另一种选择是放弃使用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]);

【讨论】:

谢谢。让我看看命名空间。我猜,像类一样,命名空间也会在主头文件中声明? @R Sahu 我想我会选择名称空间的选项 2。您能否指出qsort(sortedindices, 100, sizeof(double), uf-&gt;compar_dbl_asc); 的语法必须更改为?我将声明UF 作为命名空间的名称。我不需要把它作为一个类。 @Tryer,使用UF::compar_dbl_asc

以上是关于在另一个类的函数中使用一个类的函数指针的主要内容,如果未能解决你的问题,请参考以下文章

在另一个类中定义静态类指针

C++中怎么获取类的成员函数的函数指针

c++类的成员函数指针如何转为普通指针

基类的函数指针指向子类的成员函数?

类的成员函数this指针

模板化函数或带有指向基类的指针的函数