以下是我的代码......
我在这里使用了地图..而不是地图我想使用二维数组。 用户将输入命令代码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;
}
答案 0 :(得分:1)
如果你想避免头文件中的任何STL依赖,你可以使用PIMPL idiom并在你的实现文件中使用你想要的任何东西(例如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);
}
为了简单起见,我不允许复制和分配类,如果你真的需要它们,可以添加这些方法。