【发布时间】:2013-04-13 20:32:23
【问题描述】:
此代码从鼠标单击中获取坐标并创建一个新顶点;
void DrawingWidget::mousePressEvent(QMouseEvent *event){
if(getCurrentState()==ADD_VERTEX){
x=event->x();
y=event->y();
Vertex p1 {&x,&y};
m_mainWindow->addVertex(p1);
update();
}
}
这是 Vertex 类代码:
class Vertex {
public:
float *x = 0;
float *y = 0;
Vertex() = default;
Vertex(float *nx, float *ny);
};
所有 Verces 都保存在列表中:
QList<Vector2> vertexList;
和addVertex(顶点顶点):
addVertex(Vertex vertex){
vertexList << vertex;
}
基本上第一个顶点添加效果很好,但是当我尝试添加第二个顶点时(使用给定的方法),第一个顶点坐标被改变了。
注意! Vertex 类的坐标是有意的指针,因为通过使用另一种方法我正在改变它们的坐标。
我错过了什么?
【问题讨论】:
-
Re:“顶点类的坐标是有意的指针,因为通过使用另一种方法我正在改变它们的坐标。” - 等等,什么?您刚刚描述的内容没有任何内容需要将
x和y指针指向float。老实说,x和y真的应该只是Vertex的直接成员,如果你想要健全的代码。 -
没有什么说
event变量在函数完成后将保持不变,并且您正在存储指向其值的指针。要么你会一直指向最新的值,要么你最终会指向垃圾值/释放的内存。这取决于发生的编译器/操作系统。摘要:不要那样做。 -
考虑将 getter/setter 添加到
Vertex并使用这些方法操作坐标,而不是存储指向某个外部作用域的指针,这可能会以未知方式更改这些坐标,甚至使这些指针无效导致崩溃。您当前的实现是在自找麻烦,它不安全、容易出错并且总体上设计糟糕。