1

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

如果我按值传递 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;
}
4

1 回答 1

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;
};
于 2014-05-22T18:12:37.023 回答