【问题标题】:C++ functional: bind classes method through pointerC++ 函数式:通过指针绑定类方法
【发布时间】:2014-07-11 22:01:18
【问题描述】:

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

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

【问题讨论】:

  • a_mul 不能像那样内联初始化,所以我认为这不是您正在运行的确切代码。除了 a_mul 初始化,它看起来还可以。所以问题一定出在一些没有被展示出来的东西上……
  • @dlf "a_mul can't be initialized inline like that" 可以,欢迎使用 C++11。
  • @n.m.整洁的!但显然不是微软的 (2012) C++11。 :(
  • @mooattyi 我只想说,对于第一个问题,这是一篇非常好的帖子。您提供了一个SSCCE,清楚地说明了问题。继续加油!
  • @dlf 2012 严重缺乏 2011 部门。试试 2013 或 clang 或 gcc。

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


【解决方案1】:

您正在使用非静态数据成员初始化程序来初始化 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;
};

【讨论】:

  • 非常感谢您的回答,这就是解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多