从类中存储函数并在数组中调用它们c ++

时间:2017-10-02 14:49:07

标签: c++ class

我尝试从数组中的类存储函数(方法)并使用它们。 错误句柄是

  

在函数'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]();

3 个答案:

答案 0 :(得分:5)

使用typedef通常有助于:(c ++ 03)

<强> Live On Coliru

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别名

C ++ 11让它更容易:

    using Action = void (Calculator::*)();
    Action actions[4];
  

另见https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types

<强> Live On Coliru

std::function<>

同样在c ++ 11中(如果你想在c ++ 03中使用它,还是提升):

    using Action = std::function<void(Calculator&)>;
    Action actions[4];

你仍然可以称之为

cal.actions[1](cal);

我预先绑定到Calculator实例:

<强> Live On Coliru

#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]();
}

答案 1 :(得分:4)

你没有正确地称呼它。由于actionsCalculator的成员,因此您需要引用Calculator对象来获取它。

(cal.*(cal.actions[num]))();

第一个cal是您想要调用该操作的对象,第二个cal用于访问您要调用的操作。

答案 2 :(得分:3)

函数指针声明的C ++语法非常复杂,因此最好使用typedefs 要通过指针调用函数,您需要在解除引用的函数指针周围额外()。 最后它将是:

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);