如何在C++中将一个函数作为参数传递

4
class Stepper
{
public:
  Stepper(int en,int dir, int clk, void(*f))
  {

  }
};
class Turret : public Stepper
{
public:
  Turret(int x,int y, int z,void (*f)):Stepper(x,y,z,void(*f))
  {
  }
};
void TurretStep()
{

}
Turret t(2,3,4,TurretStep);

好的,这个错误提示告诉我void*不是指向对象类型的指针。我只是想将一个void函数作为参数传递给我的构造函数。


重复?http://stackoverflow.com/questions/25860157/passing-a-void-function-as-an-argument-to-another-function - Andrew Truckle
你可以使用 std::function。http://en.cppreference.com/w/cpp/utility/functional/function - Jesper Juhl
3个回答

6

您有两个问题。

第一个问题是您没有正确的函数指针语法

函数指针语法如下:

return_type(*name)(arguments)

因为你的函数返回类型是void并且不带任何参数,所以它是

void(*f)()

第二个问题在于试图将函数指针f传递给基类构造函数。 在这里,您正在将类型传递给基类,而实际上您只想传递变量。 不正确(在语法和参数类型方面都是如此)。
Stepper(x,y,z,void(*f)) 

正确的做法是只传递函数指针变量本身,即f

Stepper(x,y,z,f)

这里是修复后的代码:
class Stepper
{
public:
  Stepper(int en,int dir, int clk, void(*f)())
  {

  }
};
class Turret : public Stepper
{
public:
  Turret(int x,int y, int z,void (*f)()):Stepper(x,y,z,f)
  {
  }
};
void TurretStep()
{

}
Turret t(2,3,4,TurretStep);

1
你忘记给函数指针添加空括号了:
void(*f)()
        ^^
     no arguments

此外,Stepper(x,y,z,void(*f))也是错误的,因为f只是一个变量(就像xyz一样),所以为什么要将其转换为void
Stepper(x, y, z, f); //'f' is just like a "normal" variable

1
我过去是这样做的:

typedef void (TURRETSTEP)();

class Stepper
{
public:
    Stepper(int en,int dir, int clk, TURRETSTEP* f)
    {

    }
};


class Turret : public Stepper
{
public:
    Turret(int x,int y, int z, TURRETSTEP* f): Stepper(0, 0, 0, f)
    {
    }
};

void TurretStep()
{

}

我将声明一个typedef来定义“函数模板”,这很容易实现:
如果你的函数是(例如):
char* ReadString(int a, short b, int etc);

只需将函数名用括号括起来,并将其大写,如下所示:

char* (READSTRING)(int a, short b, int etc);

并添加typedef声明:

typedef char* (READSTRING)(int a, short b, int etc);

我建议使用C++的using语法:using TURRETSTEP = void(*)(); - Steve Lorimer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接