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

时间:2012-09-02 08:37:00

标签: c++ arrays visual-studio-2010 callback function-pointers

我正在开发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走错路,我需要抛出一个'&amp;'或者在Map()参数列表中我不喜欢的'*'。也许矢量不是最好的方法。

基本上,我问我怎样才能创建一个可以(并且只能)通过从数组中引用它们来调用的函数数组。我回调很糟糕。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

如果我理解正确,您确实要将SayHello声明为void SayHello(),以便指向SayHello的指针具有void (*)()类型(即CmdCallback)是你的函数向量所需要的。