【问题标题】:C++ class initializing list and passing functionsC++ 类初始化列表和传递函数
【发布时间】:2016-06-14 10:54:27
【问题描述】:

我确实在网上搜索过这个问题,但从未找到答案。我知道初始化类的两种方法,当我尝试传递函数时,其中一种方法不起作用。你能帮我理解为什么会这样吗?我应该使用什么方法?提前致谢!

void func(int i){
    cout << "GG " << i; 
}

class ac{
public:
    int a;
    function<void()> sh = bind(&func, a);

    /*ac (int i){   This does not work
        a = i;
    }*/

    ac (int i) : a(i) {};   // but this does

    void go (){
        sh();
    }
};

int main() {
    ac ac1(5);
    ac1.go();
    return 0;
}

编辑:感谢所有回复,这比我想象的要快得多。第一个示例的输出似乎是一些随机垃圾,我不确定这就是为什么我犹豫要详细说明输出的原因。

【问题讨论】:

  • 您可以通过将“不起作用”替换为实际的问题描述来大大改善这个问题。
  • 欢迎来到 StackOverflow。正如@ChristianHackl 所说,“不起作用”并不能帮助您问题的读者弄清楚您所看到的您认为不正确的行为。描述你认为应该发生的事情和实际发生的事情。为了让读者理解问题,您还应该发布足够完整的代码以实际编译和运行并显示问题。不要让人猜测代码有什么#include 指令。
  • 对不起,我故意说“不起作用”,因为我不确定输出是否是一些随机值或某物的地址。但是明白了你的意思:D
  • 如果您不打算更改 std::function 成员,那么我建议您将其替换为成员函数。十分简单。 :)
  • 实际上我的意图是将带有任意数量参数的函数传递给类。我以为我可以为此使用绑定,但即使使用上面的硬编码版本,我也会遇到错误。此外,如果没有硬编码功能,我仍然无法完成工作。如何将要绑定的函数的名称传递到类中?

标签: c++ function class pointers initialization


【解决方案1】:
ac (int i){
    a = i;
}

由于sh 是使用未初始化的a 值初始化的,因此不起作用。

【讨论】:

    【解决方案2】:

    在调用 bind 时发生绑定。

    bind 发生在构造函数初始化列表中。

    因此,在您的代码中,当您绑定函数时,您将它与acurrent 值绑定 - 这是随机的,除非它在构造函数初始化列表中被初始化。

    【讨论】:

      【解决方案3】:

      当您在类初始化中进行时,如果您自己不这样做,那么由构造函数完成它只是一种简略方式。这意味着

      ac (int i){
          a = i;
      }
      

      变成

      ac (int i) : a(garbage), sh(bind(&func, a)){
          a = i;
      }
      

      所以现在我们有一个默认的初始化(在这种情况下意味着它包含垃圾)a 用于函数,所以我们有垃圾。 a 出现在 sh 之前的原因是,这是类中的 declred 方式,它决定了初始化的顺序。

      第二个例子作为构造函数被视为

      ac (int i) : a(i), sh(bind(&func, a)){
          a = i;
      }
      

      现在当我们将a 绑定到func 时,a 被初始化为一个实际值。

      【讨论】:

      • 第二个例子是错误的。 a() 导致初始化为零,因此 a 保证为 0。
      • 提及这一点以防 OP 忽略它 - 绑定在当时永久使用 a 的值(即 i);不会在每次调用函数时重新检查类成员a
      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2014-07-14
      相关资源
      最近更新 更多