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:)我会去学习那个函数库!谢谢。我很高兴你发现我的回答很有帮助