繁体   English   中英

C ++指针/参考

[英]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类的坐标是故意的指针,因为通过使用另一种方法,我正在更改其坐标。

我想念什么?

代码中的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();
...

因此,每当您按下鼠标时,您就会覆盖旧的坐标。 现在,这可能不是问题,但是由于您添加到列表中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM