如何将函数传递给构造函数,然后将其设置为变量?

Posted

技术标签:

【中文标题】如何将函数传递给构造函数,然后将其设置为变量?【英文标题】:How do I pass in a function to a constructor that will then be set to a variable? 【发布时间】:2021-04-11 02:30:04 【问题描述】:

我不明白我做错了什么。我正在尝试将一个函数传递给构造函数,将该函数设置为一个变量,然后稍后调用该变量。 (如回调)

我得到的错误是“没有匹配的构造函数”,因为 void 不是回调......但我认为回调只是一个返回 void 的方法?

头文件

class Cars 
  typedef void *callback();

  public:
  Cars(callback* method);

  private:
  callback* method;
  void trigger();

类文件

Cars::Cars(callback method)
  this->method = method;


void Cars::trigger() 
  method();

主文件

void doSomething() 
  // does something


Cars car = Cars(doSomething());

【问题讨论】:

在现代 C++ 中,您可能希望使用 std::function 而不是回调函数指针。 @tadman — std::function 增加了相当多的开销来支持参数转换和返回类型转换。如果您不需要这些,则无需承担这些开销。 @PeteBecker 除非你打了数百万个电话,否则我怀疑你会注意到。 @tadman——如果你不需要,就不要付钱。 【参考方案1】:

这里有几个问题。

typedef void *callback();

这将callback 声明为一个返回指向void 的指针的函数。

Cars(callback* method);

因此,构造函数需要一个指向函数的指针,该函数返回指向 void 的指针。您的明显意图是使用指向返回void 的函数的指针,而不是指向void 的指针。因此,typedef 应该是:

typedef void callback();

但是,有些人发现最终结果有些复杂。相反,使用起来更清晰:

typedef void (*callback)();

Cars(callback method);

这是同样的事情,但更清楚一点。但这不是唯一的问题。

void doSomething() 
  // does something

这声明并定义了一个返回void的函数。

Cars car = Cars(doSomething());

鉴于上述定义,在 C++ 中,表达式doSomething() 显然意味着对该函数的调用,该函数产生void 结果,然后将其传递给Cars 构造函数。当然,这不是你想要做的。相反,正确的语法是:

Cars car = Cars(doSomething);

Cars car = Cars(&doSomething);

随你喜欢。单独声明的函数的名称计算为指向函数的指针(有或没有明确的&)。

【讨论】:

哇哦,这解决了很多问题。谢谢!对于“typedef void (*callback)()”,为什么会达到同样的效果? 不仅如此,构造函数的参数也只是callback而不是callback *。两者的组合在逻辑上是相同的。

以上是关于如何将函数传递给构造函数,然后将其设置为变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给静态类构造函数?

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?

我如何将参数传递给构造函数? [关闭]

使用 C/C++ 中的派生类成员变量将参数传递给 Base 构造函数

将参数传递给超类构造函数

如何将参数传递给控制器 构造函数?这是正确的做法吗?