2016-10-11 43 views
2

我不明白原始指針相當好,不幸的是我不是允許使用<vector> s,所以我無法弄清楚如何編寫一個類的參數化構造函數,該類具有另一個類對象的數組其財產。如何將對象的動態數組傳遞給另一個類的參數化構造函數?

class A{ 
    ... 
}; 

class B{ 
    int size; 
    A *arr; 
    ... 
    B(int, const A *); // am I declaring this right? 
} 

... 

B::B(int size_, const A *arr_) { // this is the constructor I'm trying to write 
    size = size_; 
    if (arr != nullptr) delete[] arr; 
    arr = new A[size]; 
    memcpy(arr, arr_, sizeof(A) * size); 
} 

如何通過這個參數而不會搞亂內存?上面的代碼無法正常工作,所以我想聽聽一些提示。我沒有設法谷歌的解決方案,雖然它似乎像我的問題已經回答,我在這種情況下道歉。

我不允許使用任何安全std::東西。我需要弄清楚如何使用C.Oops的手動內存分配工作,我的意思是來自C++,感謝您指出這一點。

所以這裏是爲我工作至今的構造:

B::B(int size_, const A *arr_) { 
    size = size_; 
    arr = new A[size_]; 
    for (int i = 0; i < size; i++) arr[i] = arr_[i]; 
} 

感謝大家的時間!

+0

您需要提供完整的測試用例。請參閱此處:http://stackoverflow.com/help/mcve您提供的代碼中沒有足夠的信息來告訴您什麼是錯誤的。 – xaxxon

+1

你可以使用'std:array'嗎? –

+1

'if(arr!= nullptr)delete [] arr;'在你的構造函數中不太可能是你想要的。呃,實際上這只是錯誤的。除非你知道'A'是可複製的,否則使用'memcpy'就是錯誤的。 – jxh

回答

3

在你的構造:

if (arr != nullptr) delete[] arr; 

arr是不是在這一點上初始化類成員。這是一個垃圾指針,可能是nullptr以外的東西,而這將嘗試到delete垃圾指針。顯然,這不會走得太遠。

只需將其刪除即可。您的構造函數集sizearr,這就是它需要做的。沒有sizearr的現有值擔心:您正在構建一個新對象。

memcpy(arr, arr_, sizeof(A) * size); 

這將只在Ais a POD有效。相反,使用std::copy(),這將在所有情況下做正確的事情。如果您不能使用std::copy()以及不允許使用std::vector,則手動編寫for循環以複製此數據。

+1

值得注意的是,這仍然不是很好,因爲它默認構造A,然後複製分配,但它足夠好,因爲OP看起來是水平的在。 –

0

沒有必要檢查構造函數中arr是否爲NULL,因爲尚未將任何內容分配給arr。

memcpy不用於複製類,因爲類通常具有存儲爲函數指針的成員函數。你的memcpy語句不應該被使用,因爲它會覆蓋在新的A [size]命令執行時在arr中創建的函數指針,並且不會讓B類正確執行。

使用for循環遍歷arr_並且只將A的數據成員從arr_複製到arr是要走的路。

例如在for循環中,您可以執行arr [i] = arr_ [i],其中i是for循環中的索引。如果類A沒有重載賦值操作符,則會發生成員變量的淺表副本。如果淺拷貝不可接受,那麼應該在A類中創建一個重載的賦值運算符(如果它不存在)。

相關問題