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)
函数 AND
、OR
和 NOT
是 non-static 成员函数。只有在提供 class 的实例时才能调用它们。
Gate_Func
是指向 non-static 成员函数的指针。它可以指向 non-static 成员函数,例如 AND
、OR
或 NOT
。为了调用它,您必须提供 class 的一个实例(就像您为了直接调用 AND
、OR
或 NOT
所必须做的一样) .您还需要为函数提供参数。
这是使用特殊语法完成的:
(p->*Gate_Func)(InputArr);
这里,p
是指向调用函数的实例的指针,InputArr
是参数。如果有多个参数,它们将像普通函数调用一样用逗号分隔。
如果记不住这个语法,也可以std::invoke(Gate_Func, p, InputArr)
。 (实例指针 p
在所有参数之前。)
对于您的情况,我怀疑您想在当前实例上调用该函数。您可以使用 this
(例如 (this->*Gate_Func)(InputArr)
)来执行此操作。
我想根据输入使用不同的函数来计算输出。 但它说:(明显调用括号前的表达式必须具有(指向-)函数类型)
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)
函数 AND
、OR
和 NOT
是 non-static 成员函数。只有在提供 class 的实例时才能调用它们。
Gate_Func
是指向 non-static 成员函数的指针。它可以指向 non-static 成员函数,例如 AND
、OR
或 NOT
。为了调用它,您必须提供 class 的一个实例(就像您为了直接调用 AND
、OR
或 NOT
所必须做的一样) .您还需要为函数提供参数。
这是使用特殊语法完成的:
(p->*Gate_Func)(InputArr);
这里,p
是指向调用函数的实例的指针,InputArr
是参数。如果有多个参数,它们将像普通函数调用一样用逗号分隔。
如果记不住这个语法,也可以std::invoke(Gate_Func, p, InputArr)
。 (实例指针 p
在所有参数之前。)
对于您的情况,我怀疑您想在当前实例上调用该函数。您可以使用 this
(例如 (this->*Gate_Func)(InputArr)
)来执行此操作。