[英]Array as private member of class
我正在嘗試創建一個具有私有成員的類,該類是一個數組。 我不知道數組的大小,直到值傳遞給構造函數。 定義類構造函數以及.h文件中的定義以允許這個可變大小的數組的最佳方法是什么?
如果你想要一個“真正的”C風格的數組,你必須在你的類中添加一個指針私有成員,並在構造函數中為它動態分配內存(使用new )。 顯然你不能忘記在析構函數中釋放它。
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中的boost :: scoped_array ,或C ++ 11中的plain std::unique_ptr
),您可以使用初始化列表初始化在構造函數之前或只是在構造函數中。
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
)來幫助你完成所有跟蹤工作。
如果您想要進行“深層復制”,則必須分配新內存並將源陣列的所有對象復制到目標陣列。 這不是完全無關緊要的,通常通過“復制和交換習語”來完成 。
仍然,最簡單的解決方案是使用std::vector
作為私有成員:它將自己處理所有分配/釋放內容,在構造/銷毀類的對象時正確構造/銷毀自身。 而且,它實現了開箱即用的深層復制語義。 如果您需要讓調用者以只讀方式訪問向量,那么您可以編寫一個getter,它返回一個const_iterator
或一個const
引用給vector
對象。
使用std :: vector是最佳選擇。 如果你需要將它傳遞給一個期望指向數組的指針的函數(就像GSL經常那樣),你仍然可以傳遞&vec[0]
......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.