c++指针/引用

C++ Pointers/References

本文关键字:引用 指针 c++      更新时间:2023-10-16

这段代码从鼠标点击中获取坐标并创建一个新的顶点;

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);
};

所有顶点都保存在list中:

QList<Vector2> vertexList;

And addVertex(Vertex顶点):

addVertex(Vertex vertex){
   vertexList << vertex;
}

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

注!顶点类的坐标故意是指针,因为通过使用另一种方法我改变了它们的坐标。

我错过了什么?

xy在您的代码中可能是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();
...

所以每次你按下鼠标,你都在覆盖旧的坐标。现在,这可能不是一个问题,但是由于您添加到列表中的 Vertexs包含指向这些类成员的指针,而不是简单地存储坐标的副本,第一个顶点似乎已经更改了坐标。

处理这个问题的方法是根本不使用指针(至少对你的类来说是这样)!
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();
   }
}