我正在尝试为学校项目实现一个菜单系统,其中我有一个包含
形式的函数指针的STL Map map<string, YMenu>
当我尝试从YMenu中调用一个成员函数来通过map向向量添加一个新的函数指针时,我得到一个错误,说它是“无效使用void表达式”。我已在下面附上相关代码。
持有数组的向量:
vector<void (*) () > nextAction;
添加函数指针的函数:
void YMenu::addNextAction(int index, void (*Action)() )
{
nextAction[index] = Action;
}
调用生成错误的成员函数时使用的语法:
Menus["0.0"].addNextAction(1, Menus["0.1"].show());
有关可能解决方案的任何想法吗?我试图在谷歌上搜索并在这里搜索但似乎无法找到答案。 :/
已解决:谢谢大家,显然我在那里犯了一些愚蠢的错误。我终于设法实现了代码并使用std :: function和std :: bind()来编译和运行。
答案 0 :(得分:1)
使用Menus["0.1"].show()
,你调用函数。
除非在最终调用成员函数指针时实际拥有对象实例,否则也无法像尝试那样存储指向成员函数的指针。我建议您查看std::function
和std::bind
:
std::vector<std::function<void()> nextAction;
nextAction.push_back(std::bind(&YMenu::show, &Menus["0.1"]));
答案 1 :(得分:1)
不使用C风格的函数指针,而是使用std::function
和std::bind
的组合,如下所示:
std::vector<std::function<void()> > nextAction;
void YMenu::addNextAction(int index, std::function<void()> Action)
{
nextAction[index] = Action;
}
Menus["0.0"].addNextAction(1, std::bind(&YMenu::show, &Menus["0.1"]));
答案 2 :(得分:1)
Menues["0.1"].show()
的类型不是函数指针。它是在特定对象上调用show()
的结果。看来,您的show()
函数会返回int
。尝试将函数推入任何形状或形式的void(*)()
时,您将没有多大乐趣!
你可能正在寻找的是std::function<void()>
,它可用于调用一个nullary函数对象,即可以在没有参数的情况下调用的东西。您想要传递的函数似乎是一个成员函数,因此它实际上有一个参数,即隐式传递的this
指针。您还想忽略std::function<void()>
很乐意为您做的返回类型。也就是说,您的nextAction
向量将被声明为
std::vector<std::function<void()> nextAction;
但是,要实际使用正确的对象添加show
函数,您还需要构造一个套装std::function<void()>
对象:由于您的成员函数需要一个对象,您需要将对象绑定到函数,例如:
Menues["0.0"].addNextAction(1, std::bind(&YMenu::show, &Menus["0.1"]));
另请注意,使用nextAction[index]
仅在此操作之前index < nextAction.size()
有效,即std::vector<T>
不会自动调整大小以适应新索引:明确地为std::vector<T>
。