如何在c++中传递函数作为参数?

How would I pass a function as a parameter in c++

本文关键字:参数 传递函数 c++      更新时间:2023-10-16
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函数作为参数给我的构造函数。

你有两个问题。

第一个是你没有正确的语法函数指针

函数指针的语法是
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);

您忘记在函数指针中添加空括号了:

void(*f)()
        ^^
     no arguments

同样,Stepper(x,y,z,void(*f))也是错误的,因为f只是一个变量(像x, yz),所以为什么将其转换为void ?

Stepper(x, y, z, f); //'f' is just like a "normal" variable

我以前是这样做的:

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()
{
}

我声明了一个定义"函数模板"的类型定义,很容易做到:

如果你的函数是(例如):

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

只需将函数名用圆括号括起来,并使其大写,就像这样:

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

并添加typepedef声明:

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