Функции указатель на функцию член
Я хочу создать указатель на функцию как член класса, указатель на другую функцию в одном классе. Причины, по которым я это делаю, сложны.
в этом примере я хотел бы, чтобы выход был "1"
class A {
public:
int f();
int (*x)();
}
int A::f() {
return 1;
}
int main() {
A a;
a.x = a.f;
printf("%dn",a.x())
}
но это не компиляции. Зачем?
5 ответов:
синтаксис неправильный. Указатель на элемент-это категория типа, отличная от обычного указателя. Указатель на элемент будет использоваться вместе с объектом его класса:
class A { public: int f(); int (A::*x)(); // <- declare by saying what class it is a pointer to }; int A::f() { return 1; } int main() { A a; a.x = &A::f; // use the :: syntax printf("%d\n",(a.*(a.x))()); // use together with an object of its class }
a.x
еще не говорит, на каком объекте должна вызываться функция. Он просто говорит, что вы хотите использовать указатель, хранящийся в объектеa
. Предисловиеa
в другой раз как левый операнд к.*
оператор сообщит компилятору, на каком объекте вызывать функцию.
int (*x)()
не является указателем на функцию-член. Указатель на функцию-член записывается следующим образом:int (A::*x)(void) = &A::f;
.
вызов функции-члена на командную строку
#include <iostream> #include <string> class A { public: void call(); private: void printH(); void command(std::string a, std::string b, void (A::*func)()); }; void A::printH() { std::cout<< "H\n"; } void A::call() { command("a","a", &A::printH); } void A::command(std::string a, std::string b, void (A::*func)()) { if(a == b) { (this->*func)(); } } int main() { A a; a.call(); return 0; }
обратите внимание
(this->*func)();
и способ объявления указателя функции с именем классаvoid (A::*func)()
вы должны использовать указатель на функцию-член, а не просто указатель на функцию.
class A { int f() { return 1; } public: int (A::*x)(); A() : x(&A::f) {} }; int main() { A a; std::cout << (a.*a.x)(); return 0; }
хотя это основано на ответах Стерлинга в другом месте на этой странице, у меня был случай использования, который не был полностью решен ими; для вектора указателей на функции выполните следующее:
#include <iostream> #include <vector> #include <stdio.h> #include <stdlib.h> class A{ public: typedef vector<int> (A::*AFunc)(int I1,int I2); vector<AFunc> FuncList; inline int Subtract(int I1,int I2){return I1-I2;}; inline int Add(int I1,int I2){return I1+I2;}; ... void Populate(); void ExecuteAll(); }; void A::Populate(){ FuncList.push_back(&A::Subtract); FuncList.push_back(&A::Add); ... } void A::ExecuteAll(){ int In1=1,In2=2,Out=0; for(size_t FuncId=0;FuncId<FuncList.size();FuncId++){ Out=(this->*FuncList[FuncId])(In1,In2); printf("Function %ld output %d\n",FuncId,Out); } } int main(){ A Demo; Demo.Populate(); Demo.ExecuteAll(); return 0; }
что-то вроде этого полезно, если вы пишете интерпретатор команд с индексированными функциями, которые должны быть объединены с синтаксисом параметров и подсказками справки и т. д. Возможно, также полезно в меню.