我正在开发一个 Visual C++ 2010 Express 控制台应用程序。
在我详细介绍之前,这里的摘要是:如何创建函数的数组/列表/向量并从该数组中调用它们?
所以我对函数指针有点困难。我正在编写一个“终端”类,该类又具有一个成员类“CommandMap”。CommandMap 类的目的是将函数的向量/数组和表示它们的字符串存储在另一个向量/数组中。我希望(仅)在类从向量调用它们时调用函数,但它仅在我将其添加到向量时执行,而不是在尝试调用它时执行。
我尝试为它定义一个类型:
typedef void (*CmdCallback)();
我声明了一个向量来包含它们:
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()
“说”时,它找到了回调,但是当它试图调用它时,我得到了这个运行时错误,除了中断或继续选项之外,我看不到任何细节。它给我的代码是。
我非常想放弃我的方法并尝试一种新方法,也许我在使用 void 指针 typedef 时走错了路,我需要在我不喜欢的地方抛出一个“&”或“*”Map()
参数列表。也许向量也不是最好的方法。
基本上,我在问如何创建一个可以(并且只能)通过从数组中引用它们来调用的函数数组。我对回调很糟糕。