[英]Storing functions from class in array and invoke them c++
我尝试从数组中的类存储函数(方法)并使用它们。 错误句柄是
在函数'int main()'中:| '范围'未在此范围内声明
这个我的代码(我删除不必要的代码)class.h:
class Calculator
{
public:
int num1,num2;
void (Calculator::*actions[4])();
void add();
void minuz();
void multi();
void div();
Calculator();
};
class.cpp:
void Calculator::add()
{}
void Calculator::minuz()
{}
void Calculator::div()
{ }
void Calculator::multi()
{}
Calculator::Calculator()
{
actions[0]=add;
actions[1]=minuz;
actions[2]=div;
actions[3]=multi;
}
主要:
Calculator cal;
.....
.....
cal.*actions[num]();
使用typedef通常会有所帮助:(c ++ 03)
class Calculator
{
public:
int num1,num2;
typedef void (Calculator::*Action)();
Action actions[4];
Calculator() {
actions[0]=&Calculator::add;
actions[1]=&Calculator::minuz;
actions[2]=&Calculator::div;
actions[3]=&Calculator::multi;
}
private:
void add() {}
void minuz() {}
void multi() {}
void div() {}
};
int main() {
Calculator cal;
(cal.*cal.actions[1])();
}
C ++ 11使它更容易:
using Action = void (Calculator::*)();
Action actions[4];
另见https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types
std::function<>
同样在c ++ 11中(如果你想在c ++ 03中使用它,还可以提升):
using Action = std::function<void(Calculator&)>;
Action actions[4];
您仍然可以称之为
cal.actions[1](cal);
我预先绑定到Calculator
实例:
#include <functional>
class Calculator
{
public:
int num1,num2;
using Action = std::function<void()>;
Action actions[4];
Calculator() {
actions[0] = [this]() { add(); };
actions[1] = [this]() { minuz(); };
actions[2] = [this]() { multi(); };
actions[3] = [this]() { div(); };
}
private:
void add() {}
void minuz() {}
void multi() {}
void div() {}
};
int main() {
Calculator cal;
cal.actions[1]();
}
你说的不对。 由于actions
是Calculator
的成员,因此您需要引用Calculator
对象来获取它。
(cal.*(cal.actions[num]))();
第一个cal
是您要调用操作的对象,第二个cal
用于访问您要调用的操作。
函数指针声明的C ++语法非常复杂,所以最好使用typedefs
要通过指针调用函数,你需要在解除引用的函数指针周围使用extra ()
。 最后它将是:
class Calculator
{
public:
typedef void (Calculator::*action)();
int num1,num2;
action actions[4];
void add();
void minuz();
void multi();
void div();
Calculator();
};
void Calculator::add()
{}
void Calculator::minuz()
{}
void Calculator::div()
{ }
void Calculator::multi()
{}
Calculator::Calculator()
{
actions[0]=&Calculator::add;
actions[1]=&Calculator::minuz;
actions[2]=&Calculator::div;
actions[3]=&Calculator::multi;
}
int main(int, char**) {
Calculator cal;
int num = 0;
(cal.*cal.actions[num])();
return 0;
}
为了更好的可读性,我建议添加函数Calculator::call_by_index(int)
:
void Calculator::call_by_index(int index)
{
(this->*actions[index])();
}
并以这种方式调用它:
cal.call_by_index(num);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.