Class 内的函数指针(明显调用括号前的表达式必须具有(指向-)函数类型)

Function Pointer inside Class (expression preceding parentheses of apparent call must have (pointer-to-) function type)

我想根据输入使用不同的函数来计算输出。 但它说:(明显调用括号前的表达式必须具有(指向-)函数类型)

int (测试Class::* Gate_Func)(向量); <<==这是我发起的功能。

然后在这里:Gate_Func = &TestClass::AND; 我可以使用 Gate_Func

来引用 AND 函数

但是为什么 输出 = Gate_Func(InputArr); 这个有一个错误: 明显调用括号前的 C++ 表达式必须具有(指向)函数类型

#include <iostream>
#include <vector>

using namespace std;
class TestClass {
public:
    int AND(vector<int> inputarr) {
        return (inputarr[0] == 1 && inputarr[1] == 1);
    }

    int OR(vector<int> inputarr) {
        return (inputarr[0] == 1 || inputarr[1] == 1);
    }

    int NOT(vector<int> inputarr) {
        if (inputarr[0] != 0) return 0;
        else return 1;
    }

    int (TestClass::* Gate_Func)(vector<int>);

    TestClass(int ChooseFunction, vector<int> inputarr) {
        InputArr = inputarr;
        switch (ChooseFunction)
        {
        case 1:
            Gate_Func = &TestClass::AND;
            break;
        case 2:
            Gate_Func = &TestClass::OR;
            break;
        case 3:
            Gate_Func = &TestClass::NOT;
            break;
        default:
            break;
        }
    }

    void calculation() {
        output = Gate_Func(InputArr); //C++ expression preceding parentheses of apparent call must have (pointer-to-) function type
    }
    vector<int> InputArr;
    int output = 2;
    void printOutput() { cout << output << endl; }
};

int main() {
    vector<int> input = { 1, 1 };

    TestClass obj(1, input);

    obj.printOutput();
}

哦!我明白了,谢谢你们,所以当我使用 'this' 时,基本上就像调用 Class 的对象,我必须从该对象调用函数!

代码如下:

#include <iostream>
#include <vector>

using namespace std;
class TestClass {
public:
    int AND(vector<int> inputarr) {
        return (inputarr[0] == 1 && inputarr[1] == 1);
    }

    int OR(vector<int> inputarr) {
        return (inputarr[0] == 1 || inputarr[1] == 1);
    }

    int NOT(vector<int> inputarr) {
        if (inputarr[0] != 0) return 0;
        else return 1;
    }

    int (TestClass::* Gate_Func)(vector<int>);

    TestClass(int ChooseFunction, vector<int> inputarr) {
        InputArr = inputarr;
        switch (ChooseFunction)
        {
        case 1:
            Gate_Func = &TestClass::AND;
            break;
        case 2:
            Gate_Func = &TestClass::OR;
            break;
        case 3:
            Gate_Func = &TestClass::NOT;
            break;
        default:
            break;
        }
        calculation();
    }

    void calculation() {
        output = (this->*Gate_Func)(InputArr); //C++ expression preceding parentheses of apparent call must have (pointer-to-) function type
    }
    vector<int> InputArr;
    int output = 2;
    void printOutput() { cout << output << endl; }
};

int main() {
    vector<int> input = { 1, 1 };

    TestClass obj(1, input);

    obj.printOutput();
}

指向成员函数的指针需要指向类型 (this) 实例的指针以及参数。提供它的语法相当丑陋:

(this->*GateFunc)(InputArr)

如果您可以访问 C++17,请使用 std::invoke:

std::invoke(GateFunc, this, InputArr)

函数 ANDORNOT 是 non-static 成员函数。只有在提供 class 的实例时才能调用它们。

Gate_Func 是指向 non-static 成员函数的指针。它可以指向 non-static 成员函数,例如 ANDORNOT。为了调用它,您必须提供 class 的一个实例(就像您为了直接调用 ANDORNOT 所必须做的一样) .您还需要为函数提供参数。

这是使用特殊语法完成的:

(p->*Gate_Func)(InputArr);

这里,p 是指向调用函数的实例的指针,InputArr 是参数。如果有多个参数,它们将像普通函数调用一样用逗号分隔。

如果记不住这个语法,也可以std::invoke(Gate_Func, p, InputArr)。 (实例指针 p 在所有参数之前。)

对于您的情况,我怀疑您想在当前实例上调用该函数。您可以使用 this(例如 (this->*Gate_Func)(InputArr))来执行此操作。