C++ 在C+;中调用指向成员函数的指针时出错+; 我有一个很大的代码,中间有一个错误。下面是代码中出现错误部分的简化版本
这就是我得到的错误:C++ 在C+;中调用指向成员函数的指针时出错+; 我有一个很大的代码,中间有一个错误。下面是代码中出现错误部分的简化版本,c++,pointers,function-pointers,pointer-to-member,C++,Pointers,Function Pointers,Pointer To Member,这就是我得到的错误: // Followings are declared in the header struct Task { public: _COORD p1; int p2; object p3; speed p4; bool(Game::*function)(_COORD, int, object, speed); }; std::vector<Task> tasks; // Followings are defined i
// Followings are declared in the header
struct Task {
public:
_COORD p1;
int p2;
object p3;
speed p4;
bool(Game::*function)(_COORD, int, object, speed);
};
std::vector<Task> tasks;
// Followings are defined in the source
void Game::timer() {
(some code here)
tasks[i].function(tasks[i].p1, tasks[i].p2, tasks[i].p3, tasks[i].p4); /*error here*/
有人知道如何修复它吗?调用方法函数指针的正确语法是
(objectPtr->*methodPtr)(
或(object.*methodPtr)(
:
调用方法函数指针的正确语法是
(objectPtr->*methodPtr)(
或(object.*methodPtr)(
:
我的建议是使用std::function代替函数指针。函数语法更友好,任何函数类型都可以从原始函数分配到lamdba表达式。还有一点似乎也有点奇怪,就是你把p1,p2,p3,p4作为函数参数传递,即使是常数。这样做会更难。至少可以重写()运算符。并使用()操作符调用pass参数一次,这样用户就不需要在“timer”函数中第二次传递参数 如果必须使用函数指针,我认为这样更好:
struct Task {
public:
int p1;
int p2;
int p3;
int p4;
bool operator()()
{
return (functionPtr)(p1,p2,p3,p4);
}
bool(*functionPtr)(int, int, int, int );
};
Task t { 1, 2 ,3 ,4, &Game::foo(int, int, int, int) };
Than client can make a easy call without passing parameters like.
t();
这样Task类的客户端就可以轻松地直接调用Task()
IMHO代码最好是:
#include <vector>
#include <functional>
std::vector<std::function<bool(void)>> functionList;
void taskPusher( std::function<bool(int,int,int,int)> foo , int p1, int p2, int p3, int p4)
{
std::function<bool()> explodeTask = [=]()
{
return foo(p1,p2,p3,p4);
} ;
functionList.push_back(explodeTask);
}
void explode()
{
for ( auto& explodeFoo : functionList)
{
explodeFoo();
}
}
#包括
#包括
std::向量函数列表;
无效任务推送器(标准::函数foo、int p1、int p2、int p3、int p4)
{
std::函数任务=[=]()
{
返回foo(p1、p2、p3、p4);
} ;
功能列表。推回(任务);
}
空洞爆炸()
{
用于(自动和爆炸:功能列表)
{
explodeFoo();
}
}
我建议使用std::function代替函数指针。函数语法更友好,任何函数类型都可以从原始函数分配到lamdba表达式。还有一点似乎也有点奇怪,就是你把p1,p2,p3,p4作为函数参数传递,即使是常数。这样做会更难。至少可以重写()运算符。并使用()操作符调用pass参数一次,这样用户就不需要在“timer”函数中第二次传递参数
如果必须使用函数指针,我认为这样更好:
struct Task {
public:
int p1;
int p2;
int p3;
int p4;
bool operator()()
{
return (functionPtr)(p1,p2,p3,p4);
}
bool(*functionPtr)(int, int, int, int );
};
Task t { 1, 2 ,3 ,4, &Game::foo(int, int, int, int) };
Than client can make a easy call without passing parameters like.
t();
这样Task类的客户端就可以轻松地直接调用Task()
IMHO代码最好是:
#include <vector>
#include <functional>
std::vector<std::function<bool(void)>> functionList;
void taskPusher( std::function<bool(int,int,int,int)> foo , int p1, int p2, int p3, int p4)
{
std::function<bool()> explodeTask = [=]()
{
return foo(p1,p2,p3,p4);
} ;
functionList.push_back(explodeTask);
}
void explode()
{
for ( auto& explodeFoo : functionList)
{
explodeFoo();
}
}
#包括
#包括
std::向量函数列表;
无效任务推送器(标准::函数foo、int p1、int p2、int p3、int p4)
{
std::函数任务=[=]()
{
返回foo(p1、p2、p3、p4);
} ;
功能列表。推回(任务);
}
空洞爆炸()
{
用于(自动和爆炸:功能列表)
{
explodeFoo();
}
}
我不知道这些事情!这就是为什么我使用指向函数的指针!非常感谢你的回答!这是非常有帮助的,所以我给它一个+1,但另一个答案是问题的确切答案,所以我接受了这一个!但是为了确保我有足够的欣赏力,我去给你最近的帖子加了很多+1:)我会去学习那个函数库!谢谢。我很高兴你发现我的回答很有帮助。我不知道这些事情!这就是为什么我使用指向函数的指针!非常感谢你的回答!这是非常有帮助的,所以我给它一个+1,但另一个答案是问题的确切答案,所以我接受了这一个!但是为了确保我有足够的欣赏力,我去给你最近的帖子加了很多+1:)我会去学习那个函数库!谢谢。我很高兴你发现我的回答很有帮助