gpt4 book ai didi

c++ - map 的二维数组替代

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:09 28 4
gpt4 key购买 nike

下面是我的代码....

我在这里使用了 map ..我想使用二维数组而不是 map 。用户将输入命令代码,比如 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;
}

最佳答案

如果你想避免头文件中的任何 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);
}

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

关于c++ - map 的二维数组替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12454958/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com