我的课程安排如下:
#include <iostream>
#include <vector>
struct Tracker
{
int a = 0;
void update()
{
a++;
}
};
struct OtherClass
{
std::vector<Tracker> activeTrack;
void updateAll()
{
for (Tracker tr : activeTrack) {
tr.update();
}
}
};
int main()
{
OtherClass o;
o.activeTrack.resize(1);
o.updateAll(); // does nothing?!
std::cout << o.activeTrack[0].a << '\n'; // Is 0; should be 1!
}
是否有一些非常简单的事情,我不了解堆栈分配的对象在向量中的行为?
答案 0 :(得分:4)
for (Tracker tr : activeTrack) {
tr.update();
}
您每次都要制作副本,并在副本上执行update()
。
使用参考:
for (Tracker& tr : activeTrack) {
tr.update();
}
答案 1 :(得分:0)
默认情况下,Vector内部始终在堆上分配。为此,它会复制传递给它的内容。问题是每次复制值时基于循环的范围。
相反,您可以使用auto来获取迭代器
for( auto it = activeTrack.begin() ; it != activeTrack.end() ; ++it)
{
it->update();
}
这样就不用担心转接问题了。
答案 2 :(得分:0)
你的迭代器是一个问题,而且你没有创建一个跟踪器实例来添加到矢量,这个工作。
#include <iostream>
#include <vector>
using namespace std;
struct Tracker
{
int a = 0;
void update()
{
a++;
}
};
struct OtherClass
{
std::vector<Tracker> activeTrack;
void updateAll()
{
for (vector <Tracker>::iterator it = activeTrack.begin(), end=activeTrack.end(); it != end; ++it)
it->update();
}
};
int main()
{
OtherClass o;
o.activeTrack.resize(1);
Tracker T;
o.activeTrack.push_back(T);
o.updateAll();
std::cout << o.activeTrack[0].a << '\n';
}
希望有所帮助