首页 > 解决方案 > C ++将类成员函数传递给其他类

问题描述

我有一个类wrapper,它拥有类的实例trigger。我想传递一个 to 的成员函数,wrapper以便trigger在某些事件上trigger可以调用这样的函数,对wrapper. 有可能这样做吗?

我对代码的想法是这样的:

class trigger {
public:
    trigger(int trigger_thr): _trigger_thr(trigger_thr){};
    trigger &operator+=(int v) {
        _trigger_value += v;
        check_trigger();
        return *this;
    }

    void set_callback(someType f){
        _f = f;
    }

private:
    int _trigger_value;
    int _trigger_thr;

    someType _f;

    void check_trigger() {
        if (_trigger_value >= _trigger_thr)
            _f();
    }
};

class wrapper {
public:
    wrapper() {
        _t.set_callback(someType some_function)
    }

private:
    void some_function() {/* do something */}

private:
    trigger _t;
}

标签: c++

解决方案


引用成员函数的语法是&wrapper::some_function. 这会创建一个指向成员函数的指针,该指针可以传递给另一个函数并存储。它的类型将是void (wrapper::*)()并且要调用该函数,您必须具有一个类型的对象wrapper(您不能只是凭空调用一个成员函数,您需要一个对象)。因此,要将其传递给触发器类,您需要传递一个wrapper*可以调用该函数的函数。给定一个p类型指针和一个指向类型wrapper*成员的指针,您会称它为最丑陋且最难记住的 C++ 语法形式之一。mvoid (wrapper::*)()(p->*m)()

或者,您可以使用 lambda 表达式创建一个捕获对象并调用成员函数的闭包对象:

set_callback( [this] { this->some_function(); } );

要将闭包对象存储在成员变量中,您需要使用std::function<void()>可以存储任何可以不带参数调用的可调用对象的对象。

因此,将函数参数和成员从更改someTypestd::function<void()>,然后在调用时使用 lambda 表达式set_callback。然后你可以_f()像在你当前的代码中那样调用它。


推荐阅读