gpt4 book ai didi

c++ - 可以调用的函数数组,如 'funs[1]();'

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:15 25 4
gpt4 key购买 nike

我正在开发 Visual C++ 2010 Express 控制台应用程序。

在详细介绍之前,这里的总结是:如何制作函数的数组/列表/vector 并从该数组中调用它们?

所以我在函数指针方面遇到了一些困难。我正在写一个“终端”类,它又有一个成员类“CommandMap”。 CommandMap 类的目的是将函数的 vector/数组和表示它们的字符串存储在另一个 vector/数组中。我希望这些函数(仅)在类从 vector 中调用它们时被调用,但它仅在我将它添加到 vector 时执行,而不是在尝试调用它时执行。

我试着为它定义一个类型:

typedef void (*CmdCallback)();

我声明了一个包含它们的 vector :

vector<string> CmdNames;
vector<CmdCallback> CmdFuncs;

我这样添加它们:

// Map a new command
bool CommandMap::Map(string name, CmdCallback func)
{
if (!IsNullOrSpace(name) && func != NULL)
{
if (!Exists(name))
{
CmdNames.push_back(name);
CmdFuncs.push_back(func);
return true;
}
}

return false;
}

我试着这样称呼他们:

// Get a command callback from its identifier
CmdCallback CommandMap::GetFunc(string name)
{
int index = IndexOf(name);
if (index == -1) return NULL;
else return CmdFuncs.at(index);
}

// If the given string is a command indentifier
// it will invoke the associated callback.
bool CommandMap::Exec(string input)
{
for each (string id in CmdStrings)
{
if (input == id)
{
CmdCallback cmd;
cmd = GetFunc(id);
cmd();
return true;
}
}

return false;
}

我试过用这个:

CmdCallback SayHello()
{
cout << "Hello World!" << endl;
return NULL; // Forces me to return null, guessing since it's
// not 'void' but a 'void' pointer it must return something
}

int main(int argc, char *argv[])
{
App = new Terminal(argc, argv);
App->Commands->Map("say", SayHello);

while (!App->ExecComplete)
{
App->WaitEnter();
App->Commands->Exec("say");
App->WaitEnter();
App->ExecComplete = true;
}

return App->ExitCode;
}

这在一开始是有效的。不过,当我尝试 Map() 时会调用该函数。当我 Exec() “说”时,它找到了回调,但是当它试图调用它时,我得到了这个运行时错误,除了 break 或继续。它给我的代码是。

我非常想放弃我的方法并尝试一种新方法,也许我使用 void pointer typedef 的方式是错误的,我需要在我没有的地方抛出 '&' 或 '*'就像在 Map() 参数列表中一样。也许 vector 也不是执行此操作的最佳方式。

基本上,我问的是如何制作一个函数数组,这些函数可以(并且只能)通过从数组中引用它们来调用。我很讨厌回调。

最佳答案

您可以使用 std::functions ,或者,如果您没有 C++11 支持,boost::function .这些是可以从自由函数或成员函数轻松构建的函数对象包装器。您可以将它们存储在标准库容器或简单数组中。

关于c++ - 可以调用的函数数组,如 'funs[1]();',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12234514/

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