[英]C++ class overloaded operator `()` called in template is not able to change member variable's value
在 C++ 中使用模板和重载运算符时遇到问题。
我想用重载的运算符()
创建一个 class Foo
,并且我还想在重载的 () 中更改 class Foo
的私有成员变量bar_
的值()
,并保留该值以供以后使用。 我必须用模板来完成这个:我将Foo
class 的 object 传递到模板中,然后在模板中使用对象的名称调用它(即运行重载的()
运算符)。 稍后,我会在 object 上调用GetBar
公众成员 function 来获取bar_
的值。
在下面的最小可重现示例中,私有成员变量bar_
的值在重载()
运算符中更改为 2,并在模板中调用。 但是,当我稍后尝试使用GetBar
公共成员 function 在模板之外获取bar_
的值时,它给了我值 1,这是在构造函数中赋予变量bar_
的初始值。 因此, ()
运算符中的值更改不起作用。
有谁知道这里发生了什么? 我不确定为什么值更改没有保存在变量中。
#include <iostream>
#include <unordered_map>
using std::unordered_map;
using std::cout;
using std::endl;
using std::unordered_map;
class Foo {
public:
Foo() : bar_(1) {}
void operator()() {
bar_ = 2;
std::cout << "print in the operator: bar_ = " << bar_ << std::endl;
return;
}
size_t GetBar() {
return bar_;
}
private:
int bar_;
};
template <typename T>
int NodeWalk(T action) {
action();
return 0;
}
int main()
{
Foo obj;
NodeWalk(obj);
cout << "print out the operator: bar_ = " << obj.GetBar() << endl;
return 0;
}
Output:
print in the operator: bar_ = 2
print outside the operator: bar_ = 1
您的 function int NodeWalk(T action)
采用参数by value ,这意味着您的operator()()
的第一个打印是从一个副本调用的,这确实改变了bar_
的值。 但是一旦 function 结束,副本就会被销毁。 在main()
中声明的原始 object 没有改变,这就是为什么当您再次尝试打印时会看到原始值的原因。
如果要更改原始文件,请通过引用传递参数,如下所示: int NodeWalk(T& action)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.