问题描述
我有以下问题。 class A
实现了一些应该在 B 类中处理的数据集上使用的例程。这意味着我正在从 start
调用函数 class A
。我正在做的事情应该保存在 m
中的变量 class A
中。到现在为止还挺好。但是,在访问类变量m
时,它仍然处于初始化时的状态。
准确地说:
#include <iostream>
#include <functional>
class A {
public:
int m;
A() {
m = 100;
}
void start(int value) {
std::cout << "hello there!" << std::endl;
m = value;
}
};
class B {
private:
int m;
public:
void doSomething() {
A a;
doSomething2(std::bind(&A::start,a,std::placeholders::_1));
// access variable m of instance a
std::cout << a.m << std::endl;
}
template <typename Callable>
void doSomething2(Callable f) {
int val = 4444;
f(val);
}
};
main()
{
B b;
b.doSomething();
}
执行此操作时,我将获得 100
作为 m
的输出。我如何才能将调用 start
所做的更改存储在类变量中?意思是,在这个例子中存储值 4444
?谢谢
解决方法
看起来您需要确保 std::bind
使用指向您创建的实际类实例的指针。尝试将其更改为:
// notice I've got '&a' here instead of just 'a'
doSomething2(std::bind(&A::start,&a,std::placeholders::_1));
如果没有这个,我猜 bind
现在正在做的是制作 a
实例的副本,然后修改该实例而不是原地更改。
默认情况下绑定采用值参数,结果 _imagePicked
作用于对象 start()
的副本。你必须通过引用传递它:
a
可能的替代方法是使用 lambda 表达式。