我试图从另一个类中绑定一个类方法,该类存储第一个指针,但它总是给我不同的值。 我做错了什么?
如果我按值传递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;
}
答案 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;
};