C ++:函数指针和类成员

时间:2017-03-17 11:22:01

标签: c++ member-function-pointers

我遇到了以下无法编译的代码问题。 问题在于

  

class2_ = new Class2(myFunction);

事实上,我现在不知道如何引用myFunction,我也试过class2_ = new Class2(&Class3::myFunction);但编译器仍然抱怨:(

2个约束:

  • 函数myFunction不能声明为静态
  • 此代码将用于Arduino基础项目,我不能使用boost :: bind
你能帮帮我吗?

感谢。

class Class2 {
    typedef void(*MyFunction)  (int what);
    MyFunction fn_;
public:
    Class2(MyFunction fn) : fn_(fn) {}

    void invoke(int val) {
        fn_(val);
    }
};

class Class3 {
    Class2* class2_;
public:
    Class3() {
        class2_ = new Class2(myFunction);
        class2_->invoke(12);
    }

    void myFunction(int what) {
        // Do some work
    }
};

void test2() {
    Class3 instance3;
}

2 个答案:

答案 0 :(得分:0)

您需要使用pointer to member function

class Class3;

class Class2 {
  typedef void(Class3::*MyFunction) (int);
  MyFunction fn_;
public:
  Class2(MyFunction fn) : fn_(fn) {}

  void invoke(Class3 *p, int val) {
    (p->*fn_)(val);
  }
};

class Class3 {
  Class2* class2_;
public:
  Class3() {
    class2_ = new Class2(&Class3::myFunction);
    class2_->invoke(this, 12);
  }

  void myFunction(int what) {
    // Do some work
  }
};

如果你希望Class2接受任何带有签名void(int)的可调用对象,那么类模板,函数包装器,lambda表达式等将有所帮助。

答案 1 :(得分:0)

如何使用界面:

class ClassWithFunction {
public:
    virtual void myFunction(int what) = 0;
}


class Class2 {
    ClassWithFunction* fn_;
public:
    Class2(MyFunction* fn) : fn_(fn) {}

    void invoke(int val) {
        fn_->myFunction(val);
    }
};

class Class3 : ClassWithFunction {
    Class2* class2_;
public:
    Class3() {
        class2_ = new Class2(this);
        class2_->invoke(12);
    }

    void myFunction(int what) {
        // Do some work
    }
};