0

此代码从鼠标单击中获取坐标并创建一个新顶点;

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){
   vertexList << vertex;
}

基本上第一个顶点添加工作完美,但是当我尝试添加第二个顶点(使用给定的方法)时,第一个顶点坐标被改变了。

注意!Vertex 类的坐标是有意的指针,因为通过使用另一种方法我正在改变它们的坐标。

我错过了什么?

4

2 回答 2

3

x并且y在您的代码中可能是字段,DrawingWidget并且Vertex您始终存储指向相同变量(那些字段)的指针。因此,vertexList您始终拥有指向相同字段的相同指针值。
我不明白你为什么对你的代码行为感到惊讶。

于 2013-04-13T20:43:07.930 回答
2

您问题中的代码和您观察到的行为意味着您有这样的事情:

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您添加到列表中的 s 包含指向这些类成员的指针,而不是简单地存储坐标的副本,第一个顶点似乎已经更改了坐标。

处理这个问题的方法是根本不使用指针(至少对于你的类)!

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();
   }
}
于 2013-04-13T20:46:12.147 回答