我想根據輸入使用不同的函式來計算輸出。但它說:(明顯呼叫括號前的運算式必須具有(指向)函式型別)
int (TestClass::* Gate_Func)(vector); <<== 這是我發起的功能。
然后在這里: Gate_Func = &TestClass::AND; 我可以使用 Gate_Func 參考 AND 函式
但為什么 output = 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”時,基本上就像呼叫類的物件,我必須從該物件呼叫函式!
這是代碼:
#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();
}
uj5u.com熱心網友回復:
函式AND、OR和NOT是非靜態成員函式。只有在提供了它們的類的實體時才能呼叫它們。
Gate_Func是指向非靜態成員函式的指標。它可以指向非靜態成員函式,例如AND、OR或NOT。為了呼叫它,您必須提供該類的實體(就像您必須為呼叫 、 或直接呼叫所做的AND那樣OR)NOT。您還需要為函式提供引數。
這是使用特殊語法完成的:
(p->*Gate_Func)(InputArr);
這里,p是指向要呼叫函式的實體的指標,并且InputArr是引數。如果有多個引數,它們用逗號分隔,就像在普通函式呼叫中一樣。
如果你不記得這個語法,你也可以做std::invoke(Gate_Func, p, InputArr). (實體指標p位于所有引數之前。)
在您的情況下,我懷疑您想在當前實體上呼叫該函式。您可以通過使用this(例如,(this->*Gate_Func)(InputArr))來做到這一點。
uj5u.com熱心網友回復:
指向成員函式的指標需要指向型別 ( this) 的實體的指標以及引數。提供它的語法相當難看:
(this->*GateFunc)(InputArr)
如果您有權訪問 C 17,請使用std::invoke:
std::invoke(GateFunc, this, InputArr)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436767.html
上一篇:類中的屬性無法保存為什么
下一篇:如何為自定義類實作迭代器?
