成员函数在外部调用的方式总结-函数指针强制绑定+lamda函数闭包行为实现this指针的绑定
生活随笔
收集整理的這篇文章主要介紹了
成员函数在外部调用的方式总结-函数指针强制绑定+lamda函数闭包行为实现this指针的绑定
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C++函數指針
使用對象指針綁定進行調用
C++中因為函數指針需要綁定的對象才能使用,因此使用方法和C語言的函數指針不太一樣
當然也可也借用該方法實現對私有函數的外部調用,因為只要使用對象強制取函數地址調用的方式,就忽略了數據保護的作用
#include <thread> #include <atomic> #include <cassert> #include <vector> #include <iostream>using namespace std;class Widget { public:void Locate() const {cout << " Widget locate " << widget << endl;}private:int widget = 1; };typedef void (Widget::*LOCATE_FUNC)();class Derive :public Widget { public:void ShowDerive() const {cout << "Derive show " << derive << endl;}LOCATE_FUNC GetLocate() {// C++中函數指針需要取地址符return (LOCATE_FUNC)&Derive::DeriveLocate;} private:void DeriveLocate() const {cout << "derive locate" << derive << endl;}int derive = 3; };/** 知道函數指針地和對象父類指針如何調用該函數* */ int main(int argc, char*argv[]) {// C++ 函數指針的調用Derive derive;LOCATE_FUNC lpLocate = derive.GetLocate();// 子類對象調用函數指針(derive.*lpLocate)(); // 必須加括號進行調用// 父類指針調用之類對象Widget *lpDerive = &derive;(lpDerive->*lpLocate)();return 0; }借用閉包特性來調用實現函數的調用
使用對象指針綁定,雖然也能夠起到在其他地方調用成員函數的作用,但是不太方便。我們可以借助lamda的閉包行為來實現函數的調用,如下,使用lamda將函數的this指針通過默認的閉包行為生成一個函數對象,并將函數對象賦值給std::function<int32_t(int32_t)>對象,一旦賦值結束,后期調用函數的時候就不需要再人為的先拿對象指針在拿函數指針進行強制綁定的形式調用了,而且理解起來很方便,對于其他人來說一旦封裝好,剩下的就是正常的函數調用了。
#include <iostream> #include <vector> #include <algorithm> #include <functional>class CallFunctions { public:int32_t GetData() const {return m_funcGetData();}int32_t SetData(int32_t data) const {return m_funcSetData(data);}public:std::function<int32_t()> m_funcGetData;std::function<int32_t(int32_t)> m_funcSetData; };class Functions { public:Functions() = default;~Functions() = default;public:int32_t SetData(int32_t data) {if (data < 0) {return -1;}m_data = data;return 0;}int32_t GetData() const {return m_data;}public:void SetFunctions(CallFunctions *lpFunctions) {m_lpCallFunctions = lpFunctions;}void FunctionsInit() {// 使用lamda的閉包行為將this綁定到GetData上,那么其他對象想要調用該對象的成員函數時,就可以直接調用// 不在需要人為的對函數和對象進行綁定在調用指針形式調用函數了auto lamda = [this]() -> int32_t {return GetData();};m_lpCallFunctions->m_funcGetData = lamda;auto setLamda = [this](int32_t data) -> int32_t {return SetData(data);};m_lpCallFunctions->m_funcSetData = setLamda;}private:CallFunctions *m_lpCallFunctions;int32_t m_data; };int main(int argc, char *argv[]) {Functions functions{};CallFunctions callFunctions;functions.SetFunctions(&callFunctions);functions.SetData(4);functions.FunctionsInit();std::cout << callFunctions.GetData() << std::endl;functions.SetData(6);std::cout << callFunctions.GetData() << std::endl;callFunctions.SetData(10);std::cout << callFunctions.GetData() << std::endl;return 0; }總結
以上是生活随笔為你收集整理的成员函数在外部调用的方式总结-函数指针强制绑定+lamda函数闭包行为实现this指针的绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Beej网络编程指南《三》
- 下一篇: 【2016年第1期】CCF大专委2016