C++中使用函数指针 【瓦特芯笔记】

     在C++类中使用函数指针。

类型定义:
     typedef 返回类型(类名::*新类型)(参数表)

//类定义

class CA

{

public:

char lcFun(int a) { return; }

};

     CA ca;
     typedef char (CA::*PTRFUN)(int);
     PTRFUN pFun;
    void main()
    {
       pFun = CA::lcFun;
       ca.(*pFun)(2);
    }
       

在这里,指针的定义与使用都加上了“类限制”或“对象”,用来指明指针指向的函数是那个类的这里的类对象也可以是使用new得到的。比如:
     CA *pca = new CA;
     pca->(*pFun)(2);
     delete pca;
     而且这个类对象指针可以是类内部成员变量,你甚至可以使用this指针。比如:类CA有成员变量PTRFUN m_pfun;

     void CA::lcFun2()
     {
         (this->*m_pFun)(2);
     }

 

一句话,使用类成员函数指针必须有“->*”或“.*”的调用。

在Qt下的demo:

 

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

//接收返回类型
typedef enum{
    MB_EX_NONE = 0x00,
    MB_EX_ILLEGAL_FUNCTION = 0x01,
    MB_EX_ILLEGAL_DATA_ADDRESS = 0x02,
    MB_EX_ILLEGAL_DATA_VALUE = 0x03,
    MB_EX_SLAVE_DEVICE_FAILURE = 0x04,
    MB_EX_ACKNOWLEDGE = 0x05,
    MB_EX_SLAVE_BUSY = 0x06,
    MB_EX_MEMORY_PARITY_ERROR = 0x08,
    MB_EX_GATEWAY_PATH_FAILED = 0x0A,
    MB_EX_GATEWAY_TGT_FAILED = 0x0B
} eMBException;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    typedef eMBException (MainWindow::*pxMBFunctionHandler )();

    typedef struct
    {
        quint8              ucFunctionCode;
        pxMBFunctionHandler pxHandler;
    } xMBFunctionHandler;

     xMBFunctionHandler test[2];

     eMBException fun1();
     eMBException fun2();

private:
    Ui::MainWindow *ui;
    quint8 value;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    test[0].pxHandler = &MainWindow::fun1;
    test[1].pxHandler = &MainWindow::fun2;

    (this->*test[0].pxHandler)();
    (this->*test[1].pxHandler)();
}

MainWindow::~MainWindow()
{
    delete ui;
}

eMBException MainWindow::fun1(){
   value = 1;
   qDebug("call fun1();");
   return MB_EX_NONE;
}

eMBException MainWindow::fun2(){
    value = 2;
    qDebug("call fun2();");
    return MB_EX_NONE;
}

 

 

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

C++中使用函数指针 【瓦特芯笔记】,布布扣,bubuko.com

时间: 2024-10-25 12:50:36

C++中使用函数指针 【瓦特芯笔记】的相关文章

关于C++与Java中虚函数问题的读书笔记

之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的代码,输入结果竟是Base,这让一直以来用C/C++的我有些莫不着头脑,不是Java里对象是引用吗?C/C++中通过指向基类的指针或引用来指向派生类,那么对于虚函数来说通过基类指针使用的是指向的派生类.但在Java中没有keyword标明虚函数,此时就不是非常明确究竟调用的谁. class base

C++中传送函数指针

函数指针是一种非常好的类型.因此,可以编写一个函数,它的一个参数是函数指针.然后,在(外部)函数使用其函数指针参数时,就间接地调用在调用函数时对应参数指向的函数. 由于指针在不同的情况下可以指向不同的函数,因此允许调用程序确定要从外部函数中调用哪个函数. 在用函数指针类型的参数调用函数时,参数可以只包含函数地址的相应类型的指针.还可以把函数名作为参数,显示传送函数.作为参数传送给另一个函数的函数有时称为回调函数. 示例: #include <iostream> using std::cout;

1、C语言中的函数指针

一 通常的函数调用 1 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 2 3 int main(int argc, char* argv[]) 4 { 5 MyFun(10); //这里是调用MyFun(10);函数 6 7 return 0; 8 } 9 10 void MyFun(int x) //这里定义一个MyFun函数 11 { 12 printf("%d\n",x); 13 } 这个MyFun函数是一个无返回值的函数,它

C++中的函数指针

时间:2014.06.14 地点:基地 ------------------------------------------------------------------------------- 一.函数指针简介 函数指针指向的是一个函数,而不是一个对象.但函数指针也和其他普通指针一样,指向特定的函数类型,函数的类型由返回类型和形参类型共同决定,与函数名无关,就像和变量名无关一样.比如: bool LengthCompare(const string&,const string& );

QT中使用函数指针

想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*commandFun)(void);一个QString ,一个指向MainWindow类成员函数的指针.但是没想到在类中使用函数指针这么复杂. 一般情况,我们使用函数指针声明和引用都很简单明了.但是在类中就不一样了.最后的成功的形式如下: class command_type { public: comm

结构体中定义函数指针

转自:http://blog.csdn.net/unix21/article/details/9293877 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n }; 形式2:在定义类型的同时定义变量 struct结构体标识符 { 成员变量列表;… } *指针变量名;

C语言结构体中的函数指针

这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in-c-struct.html,转载请注明源地址. 引言 指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序.我们要记住指针是一个指向内存地址的变量.指针可以引用如int.char……常见的数据类型,例如: int * intptr; // 声明一个指向整型值的

Delphi中的函数指针判断是否为空

delphi函数指针 只有@@p才代表了函数指针本身的地址   assigned(p) 判断是否为空 或者用 @p=nil 来判断函数指针是不是为空 Delphi中的函数指针实际上就是指针,只是在使用的时候有些不同 函数指针要先定义一个函数类型,比如 type TTestProc = procedure of object; 这是一个最简单的函数类型,没有参数,也没有返回值,并且要求是类的成员函数 类的成员函数其实就代表了调用的时候参数的不同,因为类的成员函数隐含着一个对象参数,而不是显式写明,

为什么 C++ 中成员函数指针是 16 字节?

当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes and pops on the stack are always in 8-byte strides, and pointers are 8 bytes wide. 从 CPU 的角度来看,指针无非就是内存的地址,所有的内存地址在 x86_64 平台下都是由 64 位来表示,所以假设它是 8 个字节是