[英]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類的坐標是故意的指針,因為通過使用另一種方法,我正在更改其坐標。
我想念什么?
代碼中的x
和y
可能是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.