在 C++ 中调用指向成员函数的指针时出错

Posted

技术标签:

【中文标题】在 C++ 中调用指向成员函数的指针时出错【英文标题】:Error calling pointer to member function in C++ 【发布时间】:2016-01-01 08:33:10 【问题描述】:

我的代码很大,中间有一个错误。这是有错误的部分代码的简化版本。

这是我得到的错误:

// 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*/

明显调用括号前的表达式必须有 (pointer-to-) 函数类型。



void Game::explode(bool(Game::*function)(_COORD, int, object, speed), _COORD p1, int p2, object p3, speed p4) 
    ExplodeTask task;
    task.function = function;
    task.p1 = p1;
    task.p2 = p2;
    task.p3 = p3;
    task.p4 = p4;
    tasks.push_back(task);

有人知道怎么解决吗?

【问题讨论】:

【参考方案1】:

调用方法函数指针的正确语法是(objectPtr-&gt;*methodPtr)()(object.*methodPtr)()

void Game::timer() 
    int i = 0;
    ...
    (this->*tasks[i].function)(tasks[i].p1, tasks[i].p2, tasks[i].p3, tasks[i].p4);

【讨论】:

【参考方案2】:

我的建议是使用 std::function 而不是函数指针。 Std::function 语法更友好,任何函数类型都可以分配给它,从原始函数到 lamdba 表达式。我也觉得有点奇怪,你将 p1,p2,p3,p4 作为函数参数传递,即使是常数。这样使用会更难。至少您可以覆盖 () 运算符。并使用 () 运算符调用传递参数,这样用户就不需要在“计时器”函数中第二次传递参数。

如果你必须使用函数指针,我认为那更好:

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()。

恕我直言,代码会更好:

#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();
    

【讨论】:

好吧,我不知道这些事情!这就是我使用函数指针的原因! 非常感谢您的回答!它非常有帮助,所以我给了它+1,但另一个答案是问题的确切答案,所以我接受了那个!但为了确保我足够感激,我去给你最近的帖子做了很多 +1 :) 我会去学习那个函数库! 非常感谢。我很高兴您发现我的回答很有帮助

以上是关于在 C++ 中调用指向成员函数的指针时出错的主要内容,如果未能解决你的问题,请参考以下文章

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

c++类的成员函数指针如何转为普通指针

C++函数指针与成员函数指针

指向成员函数的 C++ 指针

向下转换指向成员函数的指针

从 C++ 的成员函数中获取指向成员函数的指针