我在寫一個函數來將某個特定類的內容(一個二維直方圖,TH2F*
)複製到另一個TH2F*
。 Pratically,我希望能夠做到通過複製或通過引用傳遞指針
SafeCopy(in, out)
其中in
我輸入TH2F*
和out
是我的目的地TH2F*
。特別是,我希望以這樣的方式實現SafeCopy
,以便在out
先前未分配時也能夠工作。在第一種情況下,我實現了這個功能(錯誤)的方式
void SafeCopy(const TH2F * h_in, TH2F *h_out)
{
cout << "SafeCopy2d: output histogram address is " << h_out << endl;
if(h_out != NULL)
{
cout << "SafeCopy2d: h_out has been identified as non-zero pointer\n";
(*h_out) = *h_in; // I'm making use of the copy-constructor
// it wouldn't work if h_out == NULL
}
else
{
cout << "SafeCopy2d: h_out has been identified as null pointer\n";
h_out = new TH2F(*h_in);
cout << "SafeCopy2d: h_out address is now " << h_out << endl;
}
}
輸出功率爲
SafeCopy2d: output histogram address is 0x0
SafeCopy2d: h_out has been identified as null pointer
SafeCopy2d: h_out address is now 0xblahblah
,但當然這並不能工作,因爲退出功能時,「真正的」指針h_out仍然是0,因爲我通過複製而不是通過引用傳遞它。 然後我改變了功能的原型(不改變其實現)
void SafeCopy(const TH2F * h_in, TH2F *&h_out)
,以便通過參考傳遞h_out指針。在後一種情況下,一些奇怪的事情發生了:如果我叫SafeCopy傳遞一個NULL h_out我得到這樣的輸出:
SafeCopy2d: output histogram address is 0x*a non-zero value*
SafeCopy2d: h_out has been identified as non-zero pointer
我的問題是:爲什麼如果我通過h_out通過複製,它被正確識別爲NULL指針,而當我通過引用傳遞它時,它顯示爲非零?
編輯 這是調用代碼:
//TH2F * h_migration is created and filled previously in the program
TH2F * h_smearedMigration;//
for (int ntoy=0; ntoy < NTOY; ntoy++) {
//matrix smearing
SmartCopy(h_migration, h_smearedMigration); //copy the original matrix to a temporary one
RunToy(h_smearedMigration); //smear the matrix
...
我想避免類似
h_smearedMigration = SmartCopy(h_migration, h_smearedMigration);
,我會記住它的時候我會做更復雜的東西:)現在我只是切換到更基本的東西來解決這個問題... – Blackphoenix 2013-03-28 09:02:05
我只是出於好奇心寫了OP ...我只是不明白爲什麼通過引用傳遞poiter有一個不同的行爲通過拷貝傳遞的指針 – Blackphoenix 2013-03-28 09:03:41
@Blackphoenix當你通過複製傳遞被調用函數和調用函數可以訪問兩個不同的對象;其中一個只是另一個的副本。調用函數對其對象的修改在調用上下文中不可見。但是,如果您可以同時獲取兩個上下文來訪問同一個對象,則另一個可以看到一個對象的修改。 – bames53 2013-03-28 15:36:10