zoukankan      html  css  js  c++  java
  • C++基础--回调的应用

    一、类成员函数的回调

    1. 类成员函数的回调,函数的调用必须通过类来调用;

    CallBack.h

    #pragma once
    
    class CallBack
    {
    public:
        CallBack();
        ~CallBack();
        typedef void (CallBack::*pFunc)(int);
        void printFunc(int x);
        void FuncCall(CallBack *obj, CallBack::pFunc p);
    };

     CallBack.cpp

    #include "CallBack.h"
    #include <stdio.h>
    
    CallBack::CallBack()
    {
    }
    
    CallBack::~CallBack()
    {
    }
    
    void CallBack::printFunc(int x)
    {
        printf("CALLBACK x value is %d
    ", x);
    }
    
    void CallBack::FuncCall(CallBack *obj, CallBack::pFunc p)
    {
        int x = 5;
        (obj->*p)(x);
    }

    main.cpp

    #include "CallBack.h"
    
    int main()
    {
        CallBack *cb = new CallBack();
        cb->FuncCall(cb, &CallBack::printFunc);
        
        return 0;
    }

    运行结果为:

     二、静态函数的回调

    注意:1. 静态函数只能在声明这个函数的文件中调用;

    CallBack.h

    #pragma once
    
    typedef void(*pFunc)(int);
    static void printFunc(int x);
    void FuncCall(pFunc p, int x);
    void excute(int x);

    CallBack.cpp

    #include "CallBack.h"
    #include <stdio.h>
    
    static void printFunc(int x)
    {
        printf("CALLBACK x value is %d
    ", x);
    }
    
    void FuncCall(pFunc p, int x)
    {
        (*p)(x);
    }
    
    void excute(int x)
    {
        FuncCall(printFunc, x);
    }

    main.cpp

    #include "CallBack.h"
    
    int main()
    {
        int x = 5;
        excute(x);
        return 0;
    }

    运行结果为:

     三、回调函数在继承里的应用

    Base.h

    #pragma once
    class CBase
    {
    public:
        CBase();
        virtual ~CBase();
    
        char* x;
        typedef void (CBase::*pFunc)();
        virtual void printX();
        void FuncCall(CBase* bs, pFunc p);
    };

    Base.cpp

    #include "Base.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    CBase::CBase()
    {
        x = NULL;
        x = (char*)calloc(1, 256);
        strcpy_s(x, 256, "Base X
    ");
    }
    
    CBase::~CBase()
    {
    }
    
    void CBase::printX()
    {
        printf_s("BASE %s", x);
    }
    
    void CBase::FuncCall(CBase *obj, CBase::pFunc p)
    {
        (obj->*p)();
    }

    CallBack.h

    #pragma once
    #include "Base.h"
    
    class CallBack:public CBase
    {
    public:
        CallBack();
        ~CallBack();
    
        virtual void printX();
    };

    CallBack.cpp

    #include "CallBack.h"
    #include <stdio.h>
    #include <string.h>
    
    CallBack::CallBack()
    {
    }
    
    CallBack::~CallBack()
    {
    }
    
    void CallBack::printX()
    {
        strcpy_s(x, 256, "EXTERN x");
        printf_s("EXTERN %s", x);
    }

    main.cpp

    #include "CallBack.h"
    #include "Base.h"
    
    int main()
    {
        CBase *b = new CallBack();
        b->FuncCall(b, &CBase::printX);
        return 0;
    }

    运行结果:

  • 相关阅读:
    Android Studio 字体和字号调整
    【IDEA】项目中引入Spring MVC
    【Double】double精度问题和int、long除不尽取舍问题
    【进制转换】原码反码和补码的理解以及进制转换
    【工具】SwitchHost的使用
    【工具】谷歌浏览器使用技巧
    【Git和GitHub】学习笔记
    【IE兼容性】代码中多语言样式+IE不兼容解决
    【Trello】使用指南
    【实操】进制转换:除基倒取余法
  • 原文地址:https://www.cnblogs.com/anlia/p/9146125.html
Copyright © 2011-2022 走看看