簡體   English   中英

數組作為類的私有成員

[英]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_arraystd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM