Использование указателя на функцию из одного класса в функции другого класса

Я просмотрел следующие темы, но, похоже, они не помогают решить проблему:

Указатель на функцию-член — этот поток не помогает, потому что доступ осуществляется в основном, а не в другом классе

один класс должен вызывать метод другого класса, используя указатель на функцию — Я не мог следовать принятому ответу, так как мне не понятно, как использовать <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() для сортировки дублируется в порядке возрастания.

В UF определение класса, у меня также есть double* base_arr_dbl; в качестве декларации. Это массив значений (double), который будет использовать qsort.

Теперь в другом классе моего имени SEPУ меня есть функция, fn1 где я хотел бы иметь base_arr_dbl указать местный (чтобы fn1) двойной массив, и я хотел бы вызвать 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

Любой способ помочь решить эту проблему приветствуется.

0

Решение

Как ясно указывает компилятор в сообщениях об ошибках, ни uf->compar_dbl_asc ни &(uf->compar_dbl_asc) подходит для использования в качестве аргумента qsort,

Ты можешь использовать compar_dbl_asc в качестве аргумента qsort используя один из следующих подходов.

  1. Делать compar_dbl_asc static функция-член класса.
  2. Еще лучше создать namespace для вашего приложения и определить compar_dbl_asc в namespace, UF может быть что namespace если это не должен быть класс по некоторым другим причинам.

Другим выбором было бы отказаться от использования qsort в пользу std::sort, Последний дает вам больше возможностей. Вы можете использовать функтор или лямбда-функцию, когда вы используете std::sort, который позволит вам использовать 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]);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector