如何通过指针调用任何类的函数?

时间:2014-12-05 21:17:45

标签: c++ pointers design-patterns

我正在建造一个引擎。我需要创建一个Timer类,它将通过来自单独类的指针调用函数。例如:

class MyTimer {
public:
    void setTimeoutFunction( _pointer_, unsigned short timeoutMs ) {
        // here we need to have a opportunity to store a _pointer_ to a function
    }
    void tickTimer() {
        ...
        // here I need to call a function by a pointer
        ...
    }
};

// Main class:
class MyAnyClass {
public:
    void start() {
        MyTimer myTimer;
        myTimer.setTimeoutFunction( startThisFunc, 1500 ); // 1500ms = 1.5s
        while ( true ) {
            myTimer.tickTimer();
        }
    }
    void startThisFunc() { ... }
}

总之,如何存储指向属于某个类的函数的指针并通过指针调用该函数?

2 个答案:

答案 0 :(得分:1)

根据您的要求,我建议您将计时器设为模板

template <typename T>
struct MyTimer
{
    using FuncPtr = void (T::*)();

    MyTimer(FuncPtr ptr, T * obj, unsigned int timeout_ms)
    : ptr_(ptr), obj_(obj), timeout_ms_(timeout_ms) {}

    void tickTimer()
    {
        (obj_->*ptr_)();
    }

    FuncPtr ptr_;
    T * obj_;
    unsigned int timeout_ms_;
};

用法:

struct MyAnyClass
{
    void start()
    {
        MyTimer<MyAnyClass> myTimer(&MyAnyClass::startThisFunc, this, 1500);
        while (true) { myTimer.tickTimer(); }
    }

    void startThisFunc() { /* ... */ }
};

答案 1 :(得分:0)

在C ++ 11中,您可以使用std :: function。使用它的好指南在这里:http://en.cppreference.com/w/cpp/utility/functional/function

我创建了一个仅包含您想要的案例的新代码段。

#include <stdio.h>
#include <functional>
#include <iostream>

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int num_;
};


int main()
{
  // store a call to a member function
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
    const Foo foo(314159);
    f_add_display(foo, 1);

    return 0;
}