C++ 类的成员函数指针 ( function bind )

C++中的成员函数指针是一个指向类成员函数的指针。和普通函数指针不同,成员函数指针需要额外指定它所属的类的类型。使用成员函数指针可以方便地处理动态的事件处理和回调函数。

成员函数指针的语法格式为:`return_type (class_name::*ptr_name)(arg_types...);`

其中,`return_type`为函数返回类型,`class_name`为所属类名,`ptr_name`为指针名,`arg_types`为函数参数类型列表。注意,成员函数指针必须和所属类的类型一致,否则编译器会报错。

我们可以用`typedef`简化成员函数指针的定义,例如:

```cpp

class MyClass {

public:

void func(int arg);

};

typedef void (MyClass::*FuncPtr)(int);

```

上面的代码定义了一个成员函数指针`FuncPtr`,它可以指向`MyClass`类的某个成员函数,该成员函数接收一个`int`类型的参数并返回`void`。

使用成员函数指针可以在运行时动态选择要调用的函数,例如:

```cpp

MyClass obj;

FuncPtr ptr = &MyClass::func; // 获取成员函数指针

(obj.*ptr)(42); // 调用成员函数

```

上面的代码首先创建了一个`MyClass`对象,并将其赋给`obj`变量。然后通过`&MyClass::func`语法获取了成员函数`MyClass::func`的指针,并将其赋给了`ptr`变量。最后,使用`obj.*ptr`语法调用了`obj`对象中指向成员函数指针`ptr`的函数,并向该函数传递了一个整数参数`42`作为函数的参数。

需要注意的是,使用成员函数指针必须同时指定对象和指针才能调用函数。因此,使用成员函数指针也需要注意指针的有效性和作用域。

除了使用明确的对象和指针来调用成员函数,我们也可以使用C++11提供的`std::bind`函数来绑定一个成员函数指针和一个对象,以生成一个可调用对象(函数对象)。例如:

```cpp

#include

MyClass obj;

FuncPtr ptr = &MyClass::func; // 获取成员函数指针

auto callback = std::bind(ptr, &obj, std::placeholders::_1);

callback(42); // 调用函数对象

```

上面的代码首先创建了一个`MyClass`对象,并将其赋给`obj`变量。然后通过`&MyClass::func`语法获取了成员函数`MyClass::func`的指针,并将其赋给了`ptr`变量。接着,使用`std::bind`函数将`ptr`和`obj`绑定,生成了一个可调用对象`callback`。最后,调用`callback`的时候,传入了一个整数参数`42`作为函数的参数,随后可调用对象将成员函数指针自动绑定到`obj`对象上,并调用该成员函数。

需要注意的是,在使用`std::bind`函数生成的可调用对象时,函数的参数必须通过`std::placeholders::_n`占位符来指定,其中`n`表示参数的位置序号。因此,在调用`callback`的时候,我们可以指定函数的实际参数,例如`42`,而非占位符。

最后,我们来看一个基于成员函数指针的回调函数案例。假设我们有一个`Button`类,需要在用户点击按钮的时候调用回调函数来处理事件。我们可以使用成员函数指针和`std::bind`函数来实现该功能。代码如下:

```cpp

#include

#include

class Button {

public:

typedef std::function Callback;

void click() {

if (m_callback) {

m_callback();

}

}

void set_callback(Callback cb) {

m_callback = cb;

}

private:

Callback m_callback;

};

class MyApp {

public:

void on_button_click() {

std::cout << "Button clicked." << std::endl;

}

void run() {

Button btn;

btn.set_callback(std::bind(&MyApp::on_button_click, this));

btn.click();

}

};

int main() {

MyApp app;

app.run();

return 0;

}

```

上面的代码定义了一个`Button`类和一个`MyApp`类,其中`Button`类中定义了一个回调函数指针`Callback`,该指针将在按钮被点击时调用。`MyApp`类中定义了一个成员函数`on_button_click`,该函数将在按钮被点击时被调用。

在`MyApp::run()`函数中,我们创建了一个`Button`对象`btn`,然后使用`std::bind`函数将`MyApp::on_button_click`函数绑定到该对象上,并将绑定后的函数对象设置为`Callback`回调函数指针。最后,我们调用了`btn.click()`方法来模拟用户点击按钮,并触发回调函数的调用。

需要注意的是,在使用`std::bind`函数绑定成员函数时,需要使用`this`指针来指定当前对象的地址。同时,还需要将`MyApp::on_button_click`函数的访问级别设置为`public`,否则编译器将无法识别该函数的访问权限。

总体而言,成员函数指针和`std::bind`函数是C++中非常有用的函数指针技巧,可以帮助我们方便地处理事件处理、回调函数等动态功能。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(80) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部