首页 > 代码库 > C++中使用函数指针 【瓦特芯笔记】
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_OBJECTpublic: 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();}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。