【问题标题】:How would I pass a function as a parameter in c++如何在 C++ 中将函数作为参数传递
【发布时间】:2016-10-27 12:52:17
【问题描述】:
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 函数作为参数传递给我的构造函数。

【问题讨论】:

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


【解决方案1】:

你有 2 个问题。

首先是您没有正确的函数指针语法

函数指针的语法是

return_type(*name)(arguments)

由于您的函数具有 void 返回类型并且不接受任何参数,因此它是

void(*f)()

第二个是尝试将函数指针f 传递给基类构造函数

这里你将 type 传递给基类,而实际上你只是想传递变量

不正确(在语法和传递参数类型方面)

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

【讨论】:

    【解决方案2】:

    你忘了给函数指针加上空括号:

    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
    

    【讨论】:

      【解决方案3】:

      我习惯这样做:

      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(*)();
      猜你喜欢
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多