簡體   English   中英

函數指針 C++

[英]Function pointer c++

我正在嘗試在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 個函數:(它們在 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);
    }
}

最后,在 main.cpp 中:

solver3.setfunc(&DPkDispersionMemKN::computeMin);

我希望我可以在我想使用的主要女巫功能中進行選擇,但它不起作用。

感謝您的幫助!

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;};
                                                                  ^~~~~~~~

你需要:

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

用法類似於:

std::pair<float, int> res = (this->*func)(someI, someJ);

您在setfunc使用了錯誤的類型。 編譯器甚至會告訴你(強調我的):

在 DPkDispersionMemKN.cpp:1 包含的文件中:
./DPkDispersionMemKN.hpp:35:68: 錯誤:分配給 '
std::pair<float, int> (DPkDispersionMemKN::*)(int, int)
'來自不兼容的類型'
std::pair<float, int> (int, int)

std::pair<float, int> (DPkDispersionMemKN::*)(int, int)是函數類型。 但這不是您在聲明setfunc參數時使用的類型。 您在那里使用了不同的類型。 將其更改為正確的類型。

指向非靜態成員函數的指針需要調用類的實例。

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);

這就是您收到編譯錯誤的原因。 根據您的需要,您可以將方法更改為靜態方法,也可以切換到std::function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM