Указатель на функцию c ++ - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь использовать указатель на функцию класса DPkDispersionMemNK.

Я не понимаю, почему она не работает

Можете ли вы помочь мне, пожалуйста?

код в DPkDispersionMemKN.hpp:

#include "DPkDispersion.hpp"

class DPkDispersionMemKN : public DPkDispersion {
protected:

    float** matrixDP;
    std::pair<float,int> (DPkDispersionMemKN::*func)(int k, int i);

public:
    std::pair<float,int> computeDich(int k, int i);
    std::pair<float,int> computeSum(int k, int i);
    std::pair<float,int> computeMin(int k, int i);

    void setfunc( std::pair<float,int> (&fonction)(int, int)) { func= fonction;};
};

и 3 функции, которые я могу sh Я мог бы использовать указатель на них: (они находятся в DPkDispersionMemKN. cpp) (это не очень важно)

std::pair<float,int> DPkDispersionMemKN::computeSum(int k, int i) {
    float max=0;
    int ind= 0;

    for (int j = k - 1; j <= i - 1; j++ ) {
        if (matrixDP[k-1][j] + dist(j, i) > max) {
            max = matrixDP[k-1][j] + dist(j, i);
            ind = j;
        }
    }

    return make_pair(max,ind);
}

std::pair<float,int> DPkDispersionMemKN::computeMin(int k, int i) {
    float max=0;
    int ind= 0;

    for (int j = k - 1; j <= i - 1; j++) {
        if (min(matrixDP[k-1][j], dist(j, i)) > max){
            max = min(matrixDP[k-1][j], dist(j, i));
            ind = j;
        }
    }

    return make_pair(max,ind);
}

std::pair<float,int> DPkDispersionMemKN::computeDich(int k, int i) {
    int j;
    int a=k-1;
    int b = i-1;
    while (b-a >= 2) {
        j = (i+(a+b)) / 2;

        if (matrixDP[k-1][j]-dist(j, i) > 0) {
            b = j;
        } else {
            a = j;
        }
    }

    if (min(matrixDP[k-1][a], dist(a, i)) < min(matrixDP[k-1][b], dist(b, i))) {
        return make_pair(min(matrixDP[k-1][b], dist(b, i)), b);
    } else {
        return make_pair(min(matrixDP[k-1][a], dist(a, i)), a);
    }
}

и Finaly, в основном. cpp:

solver3.setfunc(&DPkDispersionMemKN::computeMin);

I wi sh Я мог бы выбрать в главной функции ведьмы, которую я хочу использовать но это не работает.

Спасибо за помощь!

In file included from DPkDispersionMemKN.cpp:1:
./DPkDispersionMemKN.hpp:35:68: error: assigning to 'std::pair<float, int>
      (DPkDispersionMemKN::*)(int, int)' from incompatible type
      'std::pair<float, int> (int, int)'
  ...setfunc( std::pair<float,int> (&fonction)(int, int)) { func= fonction;};
                                                                  ^~~~~~~~

Ответы [ 3 ]

1 голос
/ 31 января 2020

Вам нужно:

void setfunc(std::pair<float,int> (DPkDispersionMemKN::*fonction)(int, int)) { func = fonction;}

И использование аналогично:

std::pair<float, int> res = (this->*func)(someI, someJ);
0 голосов
/ 31 января 2020

Указателю на функцию-член, не являющуюся статичным c, требуется экземпляр класса, который необходимо вызвать.

std::pair<float,int> (DPkDispersionMemKN::*func)(int k, int i);
DPkDispersionMemKN d;
auto p = (d.*)func(1, 2);

std::pair<float,int> (*f)(int, int);
auto p2 = f(1, 2);

По этой причине вы получаете ошибку компиляции. В зависимости от того, что вам нужно, вы можете изменить методы на stati c или переключиться на std :: function

0 голосов
/ 31 января 2020

Вы использовали неправильный тип в setfunc. Компилятор даже говорит вам (выделение мое):

В файле, включенном из DPkDispersionMemKN. cpp: 1:
./DPkDispersionMemKN.hpp:35:68: ошибка: присвоение '
стандартный :: пара (DPkDispersionMemKN :: *) (int, int)
'из несовместимого типа'
std :: pair (int, int)

std::pair<float, int> (DPkDispersionMemKN::*)(int, int) - это тип функции. Но это не тот тип, который вы использовали при объявлении параметра setfunc. Вы использовали другой тип там. Измените его на правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...