c++中成员函数指针数组定义和初始化方法

实际项目中经常遇到很多类似操作,比如命令码对应执行函数等,对于此类操作,比较好的方式是使用const数组,将命令码和操作函数绑定在一起,通过查表方式找到操作函数,并执行操作函数。这样可以简化代码,降低复杂度,在c中这种方式很好实现,在c++中会稍微麻烦一些。

以串口命令解析执行为例,首先定义一个结构体,定义操作函数的指针类型:

struct T_ShellInfo
{
    string cmd;
    void (* DealFunc)(const vector<string> &vectStr);
    string desc;
};

定义命令解析执行类,处理函数要定义成static,定义一个const static的数组:

class CShell
{
public:
    CShell();
    ~CShell();
    void RecvCmd();
private:
    enum{SHELL_INFO_NUM_MAX=10};
    void GetCmd(const char *cmdStr, vector<string> &vectStr);
    void Deal(const vector<string> &vectStr);

    static void CmdHelp(const vector<string> &vectStr);
    static void CmdLed(const vector<string> &vectStr);
    static void CmdTask(const vector<string> &vectStr);
    static void CmdDisk(const vector<string> &vectStr);
    static void CmdTime(const vector<string> &vectStr);
    static void CmdReboot(const vector<string> &vectStr);

    CShell *_self;
    const static T_ShellInfo _shellInfo[SHELL_INFO_NUM_MAX];
};

实现时,先初始化数组

const T_ShellInfo CShell::_shellInfo[SHELL_INFO_NUM_MAX]=
{
    {"?",       CmdHelp,    "show all cmd"},
    {"help",    CmdHelp,    "show all cmd"},
    {"time",    CmdTime,    "show sys time"},
    {"task",    CmdTask,    "show all task info"},
    {"disk",    CmdDisk,    "disk cmd [info ls cat rm format]"},
    {"led",     CmdLed,     "set led [normal charge alarm]"},
    {"reboot",  CmdReboot,  "reboot sys"},

    {"",NULL,""}

};

串口收到命令后,只要遍历此数组,找到相同命令码的执行函数并执行即可

void CShell::Deal(const vector<string> &vectStr)
{
    for (u8 i = 0; i< SHELL_INFO_NUM_MAX; i++)
    {
        if (_shellInfo[i].cmd.length() == 0)
        {
            break;
        }
        if (_shellInfo[i].cmd == vectStr[0])
        {
            _shellInfo[i].DealFunc(vectStr);
            return;
        }
    }
    printf("cmd \"%s\" err!\r\n", vectStr[0].c_str());
}

然后逐个实现对应操作函数:

void CShell::CmdTask(const vector<string> &vectStr)
{
    u8 pcWriteBuffer[500]={0};
    //u8 *pcWriteBuffer = new u8[500]; //这个值要小心,太小会导致数组溢出,太大会导致堆栈溢出
    printf("=================================================\r\n");
    printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");
    vTaskList((char *)&pcWriteBuffer);
    printf("%s\r\n", pcWriteBuffer);
    //delete[] pcWriteBuffer;
}
时间: 2024-10-21 21:46:52

c++中成员函数指针数组定义和初始化方法的相关文章

为什么 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 个字节是

函数指针、函数指针数组

参考:百度百科 |函数指针|词条. 指针_函数,就不说了.自己感觉就是So-easy的.[ 声明格式:returnType *Function(arguments); ] 重点是 函数指针,以及突然冒出来的 函数指针数组;(特别说明,我习惯先写代码,再写注释:情况A:代码在左,注释向右.情况B:代码在上,注释在下.) 函数指针,我形象的描述 函数<-指针,(文中一切有问题请指正,谢谢).[声明格式: returnType(*pointer)(arguments); ] 举例: int fun(i

C语言中函数指针数组浅析

发现问题 问题分析 示例代码 发现问题 今天,在阅读Linux内核中关于socket的源代码时,遇到了下面一段代码: struct proto_ops { int family; struct module *owner; int (*release) (struct socket *sock); int (*bind) (struct socket *sock, struct sockaddr *myaddr, int sockaddr_len); int (*connect) (struct

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. VB中默认是没有鼠标移出事件响应的,而这个事件其实在项目开发中,实用性很强,很多时候需要在鼠标移出窗体或控件时做些事情:没有这个事件会感觉很费力: 今天我所说的实际案例就是,在窗体上,设计一个SplitterBar控件,窗体的最终用户使用这个控件可以在运行程序时任意调整其内部控件大小. 我在第二篇参考博文作者开发的

C函数指针数组的定义和使用

1.使用函数指针数组来实现计算器 2.通过函数指针变量来调用对应的函数 #include <stdio.h> int add(int a,int b){ return a+b; } int sub(int a,int b){ return a-b; } int mul(int a,int b){ return a*b; } int div(int a,int b){ return a/b; } void make_menu(){ printf("*******************

C++成员函数指针的应用

 C++中,成员指针是最为复杂的语法结构.但在事件驱动和多线程应用中被广泛用于调用回叫函数.在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数.在这样的应用中,如果不用成员指针,编程是非常困难的.  刚遇到这种语法时也许会让你止步不前.但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的.本文引导你了解成员函数指针的声明,赋值和调用回叫函数.  成员函数指针的声明  一个成员函数指针包括成员函数的返回类型,后随::操作符类名,指针名和函数的参数.初看上去,语法有点复杂.其实可以把

转:函数指针数组的妙用(I)

转自:http://blog.sina.com.cn/s/blog_4c78b35f010008hi.html 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer 和 int length,buffer是数据的首地址,length表示这批数据的长度.数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(2的8次方)种可能性.我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数

一般函数指针与成员函数指针

函数指针,顾名思义,指向函数的指针. C++中函数指针的声明形式为: void (*pfn)() C++中函数指针的赋值:pfn=funName 或 &funName C++中函数指针的使用:pfn() 或(*fun)() 看到了上面的赋值跟使用的时候,我们不禁会产生疑问,为什么指针的赋值可以用函数名?又可以用取地址的形式赋值呢?为什么可以通过指针可以直接调用函数呢?指针不是需要解引用才能访问指向的内容吗?这个我表示也暂时不理解编译器编译的时候的具体赋值细节.不过这里我们可以先把函数名,当作数组