Я просмотрел следующие темы, но, похоже, они не помогают решить проблему:
Указатель на функцию-член — этот поток не помогает, потому что доступ осуществляется в основном, а не в другом классе
один класс должен вызывать метод другого класса, используя указатель на функцию — Я не мог следовать принятому ответу, так как мне не понятно, как использовать <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
Любой способ помочь решить эту проблему приветствуется.
Как ясно указывает компилятор в сообщениях об ошибках, ни uf->compar_dbl_asc
ни &(uf->compar_dbl_asc)
подходит для использования в качестве аргумента qsort
,
Ты можешь использовать compar_dbl_asc
в качестве аргумента qsort
используя один из следующих подходов.
compar_dbl_asc
static
функция-член класса.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]);
}
Других решений пока нет …