Синтаксис для статического указателя на функцию выглядит следующим образом:
void (*FuncPtr)();
Для указателя члена вы должны использовать этот синтаксис:
void (class::*FuncPtr)();
Если ваши функции не требуютфункции быть членами функции намного чище.Как только вы выяснили, какие функции вам нужны, проще всего определить эти функции следующим образом:
typedef void(*FuncPtrType)();
typedef void(Class::*MemberFuncPtrType)();
Теперь вы можете просто объявить стек с указателями на функции, например:
std::stack <FuncPtrType> funcPtrStack;
std::stack <MemberFuncPtrType> memberFuncPtrStack;
Чтобы получить указатель на функцию, вы просто используете оператор «&», как если бы вы получали адрес для любого другого типа данных в C ++:
FuncPtrType funcPtr = &staticFunc; // Somewhere "void staticFunc()" is defined
MemberFuncPtrType memberFuncPtr = &Class::MemberFunc; // Somewhere void "Class::MemberFunc()" is defined
Чтобы фактически вызывать указатели на функции, вы должны использоватьОператор «*» для возврата данных из указателя (как и любой другой тип данных в C ++).Единственная хитрость в том, что для функций-членов им нужен указатель на класс, что делает его очень неудобным в использовании.Вот почему я рекомендовал использовать статические функции для начала.В любом случае, вот синтаксис:
(*funcPtr)(); // I just called a function with a pointer!
(this->*memberFuncPtr)(); // I just wrote some ugly code to call a member function
Показав все это, теперь должен иметь смысл следующий код:
std::stack <MemberFuncPtrType> memberFuncPtrStack; // Declaring the stack
memberFuncPtrStack.push( &Class::MemberFunc ); // Pushing a function
(ClassPtr->*memberFuncPtrStack.top())(); // Calling the function with ClassPtr