C++表驱动法代码示例

// 3个文件,Client.cpp, TableDrave.h, TableDrive.cpp

// vvvvv Client.cpp begin

// ------------------------------------------------------------
// Name         :   Client.cpp
// Description  :   调用接口
// History      : 
// ------------------------------------------------------------

#include    "TableDrive.h"

// ------------------------------------------------------------

int main()
{
    TableDrive test;
    
    test.HandleKeyword(KEYWORD_A);
    test.HandleKeyword(KEYWORD_B);
    test.HandleKeyword(KEYWORD_C);
    test.HandleKeyword(KEYWORD_START);
    test.HandleKeyword(KEYWORD_D);
    
    return 0;
}

// ^^^^^ Client.cpp end

 

// vvvvv TableDrive.h begin

// ------------------------------------------------------------
// Name         :   TableDrive.h
// Description  :   表驱动头文件
// History      :   
// ------------------------------------------------------------

#ifndef     _TEST_DRIVE_H
#define     _TEST_DRIVE_H


#include    <map>

// ------------------------------------------------------------

// 测试用关键字
enum KEYWORD
{
    KEYWORD_START = -1,
    
    KEYWORD_A = 0,
    KEYWORD_B,
    KEYWORD_C,
    KEYWORD_D,  
    
    KEYWORD_END,
};


// ------------------------------------------------------------

// 可以使用 std:: 单个引用
using namespace std;

class TableDrive
{
public: 

    // ------------------------------------------------------------
    // Description : 
    //      根据关键字,执行处理函数
    // Parameters : 
    //      string keyword,关键字
    // Return Value : 
    //      bool,true,函数执行成功,false,找不到键字对应的函数,或函数执行失败
    // Errors : 
    //      无
    // ------------------------------------------------------------ 
    bool HandleKeyword(int keyword);
    
    // ------------------------------------------------------------
    // Description : 
    //      关联关键字到处理函数
    // Parameters : 
    //      无
    // Return Value : 
    //      bool,true,正常,false,异常
    // Errors : 
    //      无
    // ------------------------------------------------------------ 
    bool MapKeyToHandle();  
    

    TableDrive();
    
    ~TableDrive();
    
private:
    
    // vv 处理函数,true,执行成功,false,执行失败
    bool HandleKeyA();
    bool HandleKeyB();
    bool HandleKeyC();
    // ^^
    
private:

    // :TRICKY: 成员函数指针定义
    typedef bool (TableDrive:: *PHandle)(void);
    map<int, PHandle>   m_KeyToHandle;      // 关键字对应处理函数
};

#endif

// ^^^^^ TableDrive.h end

 


// vvvvv TableDrive.cpp begin

// ------------------------------------------------------------
// Name         :   TableDrive.cpp
// Description  :   表驱动实现文件
// History      : 
// ------------------------------------------------------------

#include    <stdio.h>

#include    "TableDrive.h"

// ------------------------------------------------------------


// 根据关键字,执行处理函数
bool TableDrive::HandleKeyword(int keyword)
{
    typedef map<int, PHandle>::const_iterator CI;
    CI iter = m_KeyToHandle.find(keyword);

    // 没有搜索到关键字
    if (m_KeyToHandle.end() == iter)
    {
        printf("\n  @@ search Keyword %d fail!\n", keyword);
        return false;
    }

    // :TRICKY: 注意成员函数指针的引用格式
    PHandle pFunction = iter->second;
    return (this->*pFunction)();
}


TableDrive::TableDrive()
{
    printf("\n  vv TableDrive::TableDrive()\n");
    MapKeyToHandle();
}

TableDrive::~TableDrive()
{
    printf("\n  ^^ TableDrive::~TableDrive()\n");
}


// ------------------------------------------------------------

// 关联关键字到处理函数
bool TableDrive::MapKeyToHandle()
{
    m_KeyToHandle[KEYWORD_A]    = &TableDrive::HandleKeyA;
    m_KeyToHandle[KEYWORD_B]    = &TableDrive::HandleKeyB;
    m_KeyToHandle[KEYWORD_C]    = &TableDrive::HandleKeyC;
        
    return true;
}


// 处理函数 A
bool TableDrive::HandleKeyA()
{
    printf("\n  ** A, HandleKeyA()\n\n");
    
    return true;
}

bool TableDrive::HandleKeyB()
{
    printf("\n  ** B, HandleKeyB()\n\n");
    
    return true;
}

bool TableDrive::HandleKeyC()
{
    printf("\n  ** C, HandleKeyC()\n\n");
    
    return true;
}

// ^^^^^ TableDrive.cpp end


 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值