1

下面是我的代码....

我在这里使用了地图..而不是地图我想使用二维数组。用户将输入命令代码说 50 并且将调用注册的相应函数

to_do_commands.registerCommand(50,get_status);

完整代码如下

#include "stdafx.h"
#include <assert.h> 
#include <iostream> 
#include <map> 
#include <string> 
 using namespace std;


void ping(void) 
{ 
  cout << "ping command executed\n"; 
} 

void get_status()
{

cout<<"get status executed";
}

class ToDoCommands 
{ 
  public: 
    typedef void (*FunctionPtr)(); 
    typedef int Code; 

    void registerCommand(Code code,FunctionPtr); 
    void callFunction(Code); 

  private: 
    map<Code,FunctionPtr> func_map; 
}; 

void ToDoCommands::registerCommand(Code code,FunctionPtr func_ptr) 
{ 
  func_map[code] = func_ptr; 
} 

void ToDoCommands::callFunction(Code code) 
{ 
  assert(func_map.find(code)!=func_map.end()); 
  func_map[code](); 
} 

int main(int argc,char **argv) 
{ 
  ToDoCommands to_do_commands; 

 // to_do_commands.registerFunction(50,ping);
  to_do_commands.registerCommand(10,ping);
  to_do_commands.registerCommand(50,get_status);
  to_do_commands.callFunction(50); 

  return 0; 
} 
4

1 回答 1

1

如果你想在你的头文件中避免任何 STL 依赖,你可以使用PIMPL 成语并在你的实现文件中使用任何你想要的东西(例如 std::map)。

它可能看起来像这样:

// ToDoCommands.h

class ToDoCommands
{
public:
  typedef void(*FunctionPtr)();
  typedef int Code;

  ToDoCommands();
  ~ToDoCommands();

  void registerCommand(Code code, FunctionPtr fptr);
  void callFunction(Code code) const;
protected:
private:
  ToDoCommands(ToDoCommands const &); // do not copy
  ToDoCommands & operator=(ToDoCommands const &); // do not assign

  class ToDoCommandsImpl;
  ToDoCommandsImpl * m_pimpl;
};

// ToDoCommands.cpp

#include "ToDoCommands.h"

#include <map>

class ToDoCommands::ToDoCommandsImpl
{
public:
  void registerCommand(Code code, FunctionPtr fptr)
  {
    m_map[code] = fptr;
  }

  void callFunction(Code code) const
  {
    std::map<Code, FunctionPtr>::const_iterator iter = m_map.find(code);
    iter->second();
  }

protected:
private:
  std::map<Code, FunctionPtr> m_map;
};

ToDoCommands::ToDoCommands()
: m_pimpl(new ToDoCommandsImpl())
{ }

ToDoCommands::~ToDoCommands()
{
  delete m_pimpl;
}

void ToDoCommands::registerCommand(Code code, FunctionPtr fptr)
{
  m_pimpl->registerCommand(code, fptr);
}

void ToDoCommands::callFunction(Code code) const
{
  m_pimpl->callFunction(code);
}

为了简单起见,我不允许复制和分配类,如果你真的需要它们,你可以添加这些方法。

于 2012-09-17T08:08:14.820 回答