在 C++ 中调用指向成员函数的指针时出错
Error calling pointer to member function in C++
我的代码比较大,中间有错误。这是有错误的代码部分的简化版本。
这是我得到的错误:
// 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*/
expression preceding parentheses of apparent call must have
(pointer-to-) function type.
}
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);
}
有人知道怎么解决吗?
调用方法函数指针的正确语法是(objectPtr->*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);
}
我的建议是使用 std::function 而不是函数指针。 Std::function 语法更友好任何函数类型都可以分配给它,从原始函数到 lamdba 表达式。同样,即使是常量,您也将 p1、p2、p3、p4 作为函数参数传递,这对我来说似乎有点奇怪。用那种方式会更难。至少你可以覆盖 () operator 。并使用 () 运算符调用一次传递参数,这样用户就不需要在 "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 class 的客户端可以轻松地直接调用 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();
}
}
我的代码比较大,中间有错误。这是有错误的代码部分的简化版本。
这是我得到的错误:
// 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*/
expression preceding parentheses of apparent call must have (pointer-to-) function type.
}
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);
}
有人知道怎么解决吗?
调用方法函数指针的正确语法是(objectPtr->*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);
}
我的建议是使用 std::function 而不是函数指针。 Std::function 语法更友好任何函数类型都可以分配给它,从原始函数到 lamdba 表达式。同样,即使是常量,您也将 p1、p2、p3、p4 作为函数参数传递,这对我来说似乎有点奇怪。用那种方式会更难。至少你可以覆盖 () operator 。并使用 () 运算符调用一次传递参数,这样用户就不需要在 "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 class 的客户端可以轻松地直接调用 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();
}
}