拥有一个对象列表并按每个对象调用一个函数,但是canot保留了上下文,例如:
std::list<Ob> objs;
Ob ob;
ob.settings(/*...*/);
objs.push_back(ob);
/*...*/
for (Ob obj : objs)
{
obj.increase();
}
increase()
函数与本地var相加,例如:
class Ob
{
private:
int a = 0;
而且......
Ob::increase(){ this->a++; }
但a
仅在内循环中增加,如果调用10次canot保持最后一个值。
如何保持对象的上下文?
答案 0 :(得分:6)
for (Ob obj : objs)
这会在每次循环迭代中创建一个副本,并在循环迭代完成时将其丢弃。
您想要使用引用:
for (Ob& obj : objs)
答案 1 :(得分:2)
您正在传递值(即复制列表中的对象并修改它)而不是通过引用传递(这意味着修改列表中的实际项目)。请参阅下面的简单程序,说明此
#include <list>
#include <iostream>
class Obj
{
public:
void increase() { count++; }
void printCount() { std::cout << count << '\n'; }
private:
int count = 0;
};
int main()
{
{
std::list<Obj> passByValueObjs;
Obj obj;
passByValueObjs.push_back(obj);
for (Obj obj : passByValueObjs)
{
obj.increase();
}
for (Obj obj : passByValueObjs)
{
obj.printCount();
}
}
{
std::list<Obj> passByReferenceObjs;
Obj obj;
passByReferenceObjs.push_back(obj);
for (Obj &obj : passByReferenceObjs)
{
obj.increase();
}
for (Obj obj : passByReferenceObjs)
{
obj.printCount();
}
}
return 0;
}
答案 2 :(得分:1)
您正在修改该对象的副本。
更改
for (Ob obj : objs)
到
for (Ob &obj : objs)