簡體   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