gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:43:02 25 4
gpt4 key购买 nike

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

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

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

我有一个Useful F函数类,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() 中使用的比较器函数用于按升序对 double 进行排序。

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

现在,在我的另一个名为 SEP 的类(class)中,我有一个功能,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

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

最佳答案

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

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

  1. 使 compar_dbl_asc 成为该类的 static 成员函数。
  2. 更好的是,为您的应用创建一个命名空间,并在命名空间 中定义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]);
}

关于c++ - 在另一个类的函数中使用一个类的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46412593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com