我的程序中有一個特定的類,我用它來繪製各種形狀並將事件添加到形狀中。從方法中返回一個指針
vector<XQuad*> _inputMappedShape;
void addRegularShape(Container inputPoints, Container outputPoints){
XQuad quad;
setInputPoints(quad, somePoints);
setInputPoints(quad, somePoints);
setArrowHandles(quad, somePoints);
_inputMappedShape[currentIndex++] = &quad;
}
XQuad* getMappedShape(int index){
return _inputMappedShape[index];
}
void setInputPoints(XQuad& quad, Point* somePoints);
void setOutputPoints(XQuad& quad, Point* somePoint);
void setArrowHandles(XQuad& quad, Point* somePoint);
請注意,在上面的代碼(在方法addRegularshape
),我通過參考其他方法使quad
將它添加到vector
收集之前。
在我的主程序中,我試圖找回使用getMappedShape
方法,會返回一個指向四我的目的的形狀。
XQuad* returnedShape = getMappedShape(0)
我檢查的quad
的存儲器地址在addRegularShape
方法分配和由指針(來自方法getMappedShape
)正在返回的地址和存儲器地址是相同的。
但是,不知何故我XQuad
類中的數據從所述getMappedShape
返回時是不正確的(即,不將其在XQuad參考對象修改在其他三個成員函數的一個),並代替了一些無用值。我無法找到爲什麼發生這種情況的原因,並懷疑內存被損壞或出現問題,我將addRegularShape
中的引用對象更改爲指針,如下所示。
XQuad* quad = new XQuad();
在此之後,程序開始返回正確的值,但我仍然對它爲什麼會發生這種情況有點懷疑?是不是將XQuad對象添加到集合中的正確方式?或者在這裏存在一些範圍問題,即當方法超出範圍時,對象被銷燬,我從集合中實際返回的東西現在變成了垃圾值?
有沒有這種情況,我實際上可以從方法返回參考?我試圖使用引用來避免顯式使用指針。例如:一個可能具有用構造函數初始化的私有變量的類。該類的getter方法返回一個對私有變量的引用,例如'int&getTopLeftCornerX(return _pTopLeftX);'其中_pTopLeftX是該類的私有變量,並且用類構造函數初始化。 – user1240679
給OP一個很好但也有點痛苦的提示:提高編譯器的警告級別。嘗試編寫完全不產生警告的代碼。例如,gcc會警告你關於返回一個局部變量的引用。 – arne
@ user1240679:有很多情況。例如。 (std :: vector :: at()'做。 Çlass方法通常可以返回對類數據成員的引用;他們確實超過了一個電話。但你的情況是一個典型的例子,你不應該這樣做。 Getters應該是'const',最好返回一個普通的'int'。 – MSalters