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

时间:2016-06-24 20:01:09

标签: c++ function parameters arduino parameter-passing

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函数作为参数传递给我的构造函数。

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

我习惯这样做:

Error: dims [product 619] do not match the length of object [618]

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

如果您的功能是(例如):

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

并添加typedef声明:

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