我在開發天文館軟件時正在學習C++。我正在使用Visual Studio Enterprise 2015.通過引用傳遞類實例
我遇到了通過引用傳遞兩個類實例的麻煩。
這是我如何創建兩個類實例,並將它們傳遞給方法:
MyTime* newRightAscension = new MyTime(0, 0, 0, 0, 0);
DegreesCoordinate* newDeclination = new DegreesCoordinate(0, 0, 0, NotSet);
precession->RigorousMethod(epoch1, rightAscension, declination, epoch2, newRightAscension, newDeclination);
這是precession->RigorousMethod
方法聲明:
void Precession::RigorousMethod(
DateTime * epoch1,
MyTime * rightAscension,
DegreesCoordinate * declination,
DateTime * epoch2,
MyTime* newRightAscension,
DegreesCoordinate* newDeclination)
這我怎麼更新newRightAscension
和newDeclination
裏面的值該方法:
newDeclination = new DegreesCoordinate(decResult->getDegrees(), decResult->getMinutes(), decResult->getSeconds(), decResult->getDirection());
newRightAscension = new MyTime(raResult->getHour(), raResult->getMinute(), raResult->getSeconds(), raResult->getTimeZone(), raResult->getDayLightSavings());
創建一個新的實例,但是當我在方法執行後檢查這些值時,他們沒有這些值。
我在做什麼錯?
您顯示的代碼是傳遞一個指針,而不是「引用實例」,而您的預期用途似乎需要通過引用傳遞指針:在'RigorousMethod'的簽名中,這將是'DegreesCoordinate *&newDeclination'。但是,然後你所描述的看起來像是內存泄漏,所以你可能應該改變更多。 – JSF
您正在newDeclination和newRightAscension中創建一個新的類實例,覆蓋傳遞給該函數的指針的值(並導致內存泄漏)。如果要更改在函數外創建的實例的類成員的值,只需調用set函數即可。如果你想在函數內部分配新的實例,你需要通過**或*& - 不需要在函數外部分配。 – EylM
你真的想通過創建一個新的對象來改變'newDeclination'嗎?這將通過傳遞'*&'來完成,正如我在第一條評論中所描述的那樣。但通過'&'傳遞並更改對象的內容(而不是創建新對象)可能更有意義。 – JSF