我想創建一個具有私有成員的類,它是一個數組。我不知道數組的大小,直到值傳遞給構造函數。定義類構造函數以及.h文件中的定義以允許此數組的可變大小的最佳方法是什麼?數組作爲類的私有成員
回答
如果你想要一個「真正的」C風格的數組,你必須向你的類添加一個指針私有成員,並在構造函數中動態分配它的內存(與新)。顯然你不能忘記在析構函數中釋放它。
class YourClass
{
private:
int * array;
size_t size;
// Private copy constructor operator to block copying of the object, see later
// C++03:
YourClass(const YourClass &); // no definition
// C++11:
YourClass(const YourClass&) = delete;
public:
YourClass(size_t Size) : array(new int[Size]), size(Size)
{
// do extra init stuff here
};
~YourClass()
{
delete [] array;
}
};
爲了使這項工作更容易,你可以考慮(在C++ 03或C++ 11平std::unique_ptr
例如boost::scoped_array)使用智能指針,你可以使用初始化初始化在構造函數之前列出或僅在構造函數中列出。
class YourClass
{
private:
boost::scoped_array<int> array; // or in C++11 std::unique_ptr<int[]> array;
size_t size;
public:
YourClass(size_t Size) : array(new int[Size]), size(Size)
{
// do extra init stuff here
}
// No need for a destructor, the scoped_array does the magic
};
這兩種解決方案產生不可複製的對象(如果他們不得不可拷貝和複製他們的語義沒有指定);如果不需要複製類(這會發生大部分時間),那麼這兩者都可以,如果您嘗試將一個類複製/分配給另一個類,則編譯器將生成錯誤,在第一種情況下,因爲缺省副本在第二種情況下,構造函數已被重載(或在C++ 11中被簡單刪除),因爲boost::scoped_array
和std::unique_ptr
是不可複製的。
如果您想擁有可複製的對象,那麼您必須決定是否要創建共享數組的副本(所以,只是一個指針副本),或者如果您想創建一個新的獨立數組另一個對象。
在第一種情況下,釋放分配的內存之前必須非常小心,因爲其他對象可能正在使用它;參考計數器是最常見的解決方案。您可以通過boost::shared_array(或C++ 11中的std::shared_ptr
)幫助您完成所有跟蹤工作。
如果您想要執行「深層複製」,則必須分配新內存並將源數組的所有對象複製到目標數組。這不是完全正確的微不足道的,通常通過"copy and swap idiom"完成。
儘管如此,最簡單的解決方案是使用一個std::vector
作爲私有成員:它會自己處理所有的分配/解除分配的東西,當你的類的對象被構造/破壞時,正確地構造/銷燬它自己。此外,它實現了深入複製語義。如果您需要讓您的調用者以只讀方式訪問向量,那麼您可以編寫一個吸氣器,該吸氣器返回const_iterator
或const
對vector
對象的引用。
使用std :: vector是最好的選擇。 如果您需要將它傳遞給一個指向數組的指針(如GSL經常這樣做),那麼您仍然可以通過&vec[0]
...
- 1. C++類的私有成員
- 2. Java - 私有成員vs私有內部類的默認成員
- 3. 靜態數組作爲一個私有成員
- 4. 如何使用私有php類成員變量作爲數組中的鍵?
- 5. java私有類成員
- 6. 數組作爲類成員和計數
- 7. 如何將數組作爲私有類成員並確保正確封裝?
- 8. 聲明靜態私有數組成員
- 9. 靜態成員類 - 聲明類私有和類成員包私有?
- 10. 將一個類的數組聲明爲該類的私有成員?
- 11. 私有數據VS類成員變量
- 12. 從私有函數訪問類成員
- 13. 更改私有類成員的類
- 14. C++:二維數組作爲類成員
- 15. 動態數組作爲類成員
- 16. 在抽象基使用的unique_ptr作爲私有成員類
- 17. 使用boost :: mutex作爲類的私有成員
- 18. 私有成員
- 19. C++私有函數成員
- 20. 對象類型私有類成員
- 21. 訪問超類的私有成員
- 22. 訪問私有類中的成員
- 23. 訪問C++父類的私有成員
- 24. Retrive私有類成員的名字
- 25. 閱讀私有變量的類成員
- 26. TCL如何擁有一個數組作爲類的成員(Itcl)
- 27. Ninject:傳遞私有成員作爲構造函數參數
- 28. 作爲私有數據成員的C++結構體
- 29. 作爲私人成員的類類型,MVP?
- 30. 包私有靜態成員類與包私有類
對於數組,您需要確保使用' scoped_array',而不是'scoped_ptr'。 – 2010-01-17 23:01:17
更正,謝謝。我總是得到delete []權利,但有時我忘記了智能指針的陣列版本。 – 2010-01-17 23:04:21
唯一的竅門是如果YourClass將被複制,因爲scoped_ *在boost中是不可複製的。無論如何,這在問題中沒有說明,所以無論如何+1。 – Skurmedel 2010-01-17 23:04:31