考虑一个 Drag 对象:
class Drag {
public:
Drag(ofVec3f _pos);
ofVec3f pos;
}
创建新实例时存储位置:
Drag::Drag(ofVec3f _pos) {
pos = _pos;
}
鼠标移动时更新位置:
void Drag::mouseMoved() {
pos.x = ofGetMouseX();
pos.y = ofGetMouseY();
}
在应用程序的主类(openframeworks 中的 testApp)中:
class testApp : public ofBaseApp {
public:
vector<Drag> drags;
vector<ofVec3f *> points;
}
按下鼠标时创建一个 Drag 并将其位置存储在一个名为 points 的向量中:
void testApp::mousePressed(int x, int y, int button) {
Drag drag = Drag(ofVec3f(ofGetMouseX(), ofGetMouseY(), 0));
drags.push_back(drag);
points.push_back(&drag.pos);
}
现在,当拖动移动时,我可以看到它的位置更新,但 points[0] 没有改变:
void testApp::update(){
if (!drags.size()) return;
cout << drags[0].pos.x << ", " << drags[0].pos.y << endl;
cout << &points[0]->x << ", " << &points[0]->y << endl;
}
如果点的类型vector<ofVec3f>
似乎是点[0] 是初始拖动[0].pos 的副本。如果是,vector<ofVec3f *>
那么它似乎在内存上存储了一个等于 &drag 的地址。
如何使 points[0] 指向 drags[0].pos 并在 drags[0].pos.x 和 drags[0].pos.y 更新时更新其 x,y 值?
如何使 points[0] 成为对drags[0].pos的引用?
编辑:感谢 yonilevy 为我指明了正确的方向。这是使用 std::list 更新的工作示例:
// testApp.h
list<Drag> drags;
vector<ofVec3f *> points;
// testApp::mousePressed
drags.push_back(Drag(ofVec3f(ofGetMouseX(), ofGetMouseY(), 0)));
points.push_back(&drags.back().pos);