【问题标题】: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——如果你不需要,就不要付钱。

标签: c++


【解决方案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 *。两者的组合在逻辑上是相同的。
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2017-09-28
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多