2015-12-12 72 views
0

我在開發天文館軟件時正在學習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) 

這我怎麼更新newRightAscensionnewDeclination裏面的值該方法:

newDeclination = new DegreesCoordinate(decResult->getDegrees(), decResult->getMinutes(), decResult->getSeconds(), decResult->getDirection()); 
newRightAscension = new MyTime(raResult->getHour(), raResult->getMinute(), raResult->getSeconds(), raResult->getTimeZone(), raResult->getDayLightSavings()); 

創建一個新的實例,但是當我在方法執行後檢查這些值時,他們沒有這些值。

我在做什麼錯?

+0

您顯示的代碼是傳遞一個指針,而不是「引用實例」,而您的預期用途似乎需要通過引用傳遞指針:在'RigorousMethod'的簽名中,這將是'DegreesCoordinate *&newDeclination'。但是,然後你所描述的看起來像是內存泄漏,所以你可能應該改變更多。 – JSF

+0

您正在newDeclination和newRightAscension中創建一個新的類實例,覆蓋傳遞給該函數的指針的值(並導致內存泄漏)。如果要更改在函數外創建的實例的類成員的值,只需調用set函數即可。如果你想在函數內部分配新的實例,你需要通過**或*& - 不需要在函數外部分配。 – EylM

+0

你真的想通過創建一個新的對象來改變'newDeclination'嗎?這將通過傳遞'*&'來完成,正如我在第一條評論中所描述的那樣。但通過'&'傳遞並更改對象的內容(而不是創建新對象)可能更有意義。 – JSF

回答

1

一種方法(使用按引用傳遞指針):

MyTime* newRightAscension = 0; // Don't create an object yet 
DegreesCoordinate* newDeclination = 0; 

precession->RigorousMethod(epoch1, rightAscension, declination, epoch2, newRightAscension, newDeclination); 

...

void Precession::RigorousMethod(
    DateTime * epoch1, 
    MyTime * rightAscension, 
    DegreesCoordinate * declination, 
    DateTime * epoch2, 
    MyTime*& newRightAscension, 
    DegreesCoordinate*& newDeclination) 

這是有道理的,當它是一個函數負責創建這兩​​個對象。所以你不想初始化指向虛擬對象的指針。聲明時根本不需要初始化,但初始化爲0會使代碼更安全。

+0

謝謝。有用!! – VansFannel

0

外部RigorousMethod您爲MyTimeDegreesCoordinate對象分配內存。當你調用這個方法時,你傳遞指向這些內存地址的指針,你不會傳遞引用。在你的方法內部,你可以通過設置新分配的對象的地址,簡單地重置本地指針變量的內存地址(最初指向你在該方法之外創建的對象的內存地址)。這當然對原始實例沒有影響。相反,唯一的影響是你有內存泄漏,因爲RigorousMethod以外的指針都不能訪問新創建的對象。如果您想看到一個快速效果,請將參數從Type*更改爲Type&,更改指向參考的指針並替換pointer_to_object = new Constructor{ /*something*/ }。與reference_to_object = Constructor{ /*something*/ },例如改爲MyTime*MyTime&newRightAscension = new MyTime{ /*something*/ }改爲newRightAscension = MyTime{ /*something*/ }。然後你傳遞你的參數爲*pointer_to_object,而不是僅僅傳遞pointer_to_object