2013-04-13 6 views
0

Этот код берет координаты с помощью мыши и создает новую вершину;C++ Указатели/Ссылки

void DrawingWidget::mousePressEvent(QMouseEvent *event){ 
    if(getCurrentState()==ADD_VERTEX){ 
     x=event->x(); 
     y=event->y(); 

     Vertex p1 {&x,&y}; 
     m_mainWindow->addVertex(p1); 
     update(); 
    } 
} 

Вот Vertex код класса:

class Vertex { 

public: 

    float *x = 0; 
    float *y = 0; 

    Vertex() = default; 
    Vertex(float *nx, float *ny); 
}; 

Все Verces проводятся в списке:

QList<Vector2> vertexList; 

И AddVertex (Vertex вершина):

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

В основном первый добавление вершин отлично работает, но когда Я пытаюсь добавить вторую вершину (используя данный метод), вместо этого меняются первые координаты вершин.

NB! Координаты класса Vertex являются намеренно указателями, потому что, используя другой метод, я меняю свои координаты.

Что мне не хватает?

+5

Re: «Координаты класса Vertex намеренно указываются, потому что, используя другой метод, я меняю свои координаты». - Чего ждать? Ничего о том, что вы только что описали, требует, чтобы указатели 'x' и' y' были 'float'. Честно говоря, 'x' и' y' действительно должны быть просто непосредственными членами 'Vertex', если вы хотите использовать здравый код. –

+0

Ничто не говорит о том, что после завершения функции переменная 'event' не изменится, и вы сохраните указатели на ее значения. Либо вы будете указывать на последние значения, либо в конце концов укажете на значения мусора/освобожденную память. Речь идет о компиляторе/ОС. Резюме: не делайте этого. – Dave

+0

Рассмотрите возможность добавления геттеров/сеттеров в «Вершину» и манипулирования координатами с помощью этих методов, вместо того, чтобы хранить указатель на какую-либо внешнюю область действия, которая может изменить эти координаты неизвестным образом или даже привести к недействительности этих указателей, что приведет к сбою. Ваша текущая реализация требует неприятностей, она небезопасна, подвержена ошибкам и плохо разработана в целом. –

ответ

3

x и y в вашем коде, вероятно, поля DrawingWidget и Vertex вы хранение указателей всегда одинаковые переменные (эти поля). Таким образом, в vertexList у вас всегда одинаковые значения указателей на одни и те же поля.
Я не понимаю, почему вас удивляет поведение вашего кода.

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 с вы добавляете в список указатели этим членам класса, вместо простого хранения копии координат, первая вершина, по-видимому, изменила координаты.

Способ борьбы с этим - не использовать указатели вообще (по крайней мере для ваших классов)!

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(); 
    } 
} 
+0

Как я могу изменить X и Y? –

+0

@Ricardo Simmus: вы можете написать функции getter/setter для 'Vertex' (см. Обновленный пример). –

+0

Благодарим за помощь! Извините за мой глупый вопрос. –

Смежные вопросы