[英]C++ Pointers/References
该代码通过单击鼠标获取坐标并创建一个新的顶点。
void DrawingWidget::mousePressEvent(QMouseEvent *event){
if(getCurrentState()==ADD_VERTEX){
x=event->x();
y=event->y();
Vertex p1 {&x,&y};
m_mainWindow->addVertex(p1);
update();
}
}
这是顶点类代码:
class Vertex {
public:
float *x = 0;
float *y = 0;
Vertex() = default;
Vertex(float *nx, float *ny);
};
所有Verces都保存在列表中:
QList<Vector2> vertexList;
和addVertex(Vertex vertex):
addVertex(Vertex vertex){
vertexList << vertex;
}
基本上,第一个顶点添加可以完美地工作,但是当我尝试添加第二个顶点(使用给定的方法)时,第一个顶点坐标会更改。
NB! Vertex类的坐标是故意的指针,因为通过使用另一种方法,我正在更改其坐标。
我想念什么?
代码中的x
和y
可能是DrawingWidget
字段,而在Vertex
您将始终存储指向相同变量(这些字段)的指针。 因此,在vertexList
您始终具有指向相同字段的指针的相同值。
我不明白为什么您会对自己的代码行为感到惊讶。
您问题中的代码和所观察到的行为暗示您具有以下内容:
class DrawingWidget
{
public:
void mousePressEvent(QMouseEvent *event);
private:
float x;
float y;
// ...
};
当调用函数mousePressEvent()
,您正在为这些成员分配新坐标:
void DrawingWidget::mousePressEvent(QMouseEvent *event){
if(getCurrentState()==ADD_VERTEX){
x=event->x();
y=event->y();
...
因此,每当您按下鼠标时,您就会覆盖旧的坐标。 现在,这可能不是问题,但是由于您添加到列表中的Vertex
包含指向这些类成员的指针 ,而不是简单地存储坐标的副本,因此第一个顶点似乎已更改了坐标。
解决这个问题的方法是根本不使用指针(至少对于您的类而言)!
class Vertex
{
public:
Vertex() : x(0.0f), y(0.0f) {}
Vertex(float x, float y) : x(x), y(y) {}
float getX() const { return x; }
float getY() const { return y; }
void setX(float x) { this->x = x; }
void setY(float y) { this->y = y; }
private:
float x; // NOT pointers!
float y;
};
class DrawingWidget
{
public:
void mousePressEvent(QMouseEvent *event);
private:
//float x; // Not needed!
//float y;
// ...
};
void DrawingWidget::mousePressEvent(QMouseEvent *event) {
if(getCurrentState()==ADD_VERTEX) {
Vertex p1{event->x(), event->y()};
m_mainWindow->addVertex(p1);
update();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.