C ++功能:通过指针绑定类方法

时间:2014-05-22 17:56:17

标签: c++ c++11 functional-programming std-function stdbind

我试图从另一个类中绑定一个类方法,该类存储第一个指针,但它总是给我不同的值。 我做错了什么?

如果我按值传递A类(当然修改B类以按值存储)它正在工作。

#include <iostream>
#include <functional>

using namespace std;

class A {
public:
    A(double a, double b) : a(a), b(b) {}
    double mul(void) {return a*b;}

private:
    double a;
    double b;
};

class B {
typedef std::function<double(void)> function;

public:
    B(A* ap) : ap(ap) {}

    function a_mul = bind(&A::mul, ap);

private:
    A* ap;
};

int main() {
  A* a = new A(2,3);
  B b(a);

  cout << b.a_mul() << endl;

  return 0;
}

1 个答案:

答案 0 :(得分:4)

您正在使用非静态数据成员初始值设定项来初始化a_mul。初始值取决于ap的值。但是,ap的定义遵循a_mul的定义。这意味着a_mul将在在构造函数中初始化ap之前初始化。在启动时,ap具有不确定的值,因此您的代码具有未定义的行为。

解决此问题的一种方法是更改​​成员变量的定义顺序:

class B {
typedef std::function<double(void)> function;

public:
    B(A* ap) : ap(ap) {}

    A* ap;
    function a_mul = bind(&A::mul, ap);
};

但更好的修复方法是重新排序数据成员,在构造函数的初始化列表中初始化a_mul

class B {

typedef std::function<double(void)> function;

private:
    A* ap;

public:
    B(A* ap) : ap(ap), a_mul(bind(&A::mul, ap)) {}

    function a_mul;
};