2012-11-01 353 views
0

我想創建一個像容器向量的向量。創建獨立於構造函數參數的對象指針

隨後宣佈:

Vector< A> Avector. 

雖然分配內存它給出了一個不具有默認構造函數編譯錯誤。 我寫了下面的代碼來分配內存。

char *pBuffer = (char*) malloc(size*sizeof(T)); 
    T *array; 
    for(int i = 0; i < size; i++) 
    { 
    (array+i) = new(pBuffer + i) T; 
    } 
    return array; 

T是模板變量。

該錯誤是由於這樣的事實:在放置新我使用的T默認構造函數,而我沒有寫一個默認的構造函數爲A.

我想知道,有沒有什麼辦法讓內存分配不依賴於構造函數簽名。

回答

2

在C++調用new做了兩兩件事:

  1. 被中分配創建&
  2. 提供機會向正確初始化對象足夠的內存爲對象通過調用其構造函數。

這是C++作爲一種語言的基本設計特性,pt 2被添加到可以克服malloc行爲的分配內存中。

總之,你不能改變這種行爲。

1

這不是依賴於構造函數簽名的內存分配。這是初始化它。

即使在您的示例中,分配也是由malloc執行的,無需調用任何構造函數。這是初始化(由placement-new執行),需要使用構造函數。

沒有辦法在不調用構造函數的情況下初始化用戶定義的對象。

但是,至少在C++ 11中,您可以執行的操作是將代碼放入一個函數,該函數將構造函數所需的參數作爲rvalue-references接受,並將它們傳遞給構造函數調用在放置新的。這種方式取決於函數的調用者傳遞正確的參數。如果沒有參數傳遞,將調用默認構造函數。

這實際上是由新std::vectoremplace-style functions使用的技術:

template< class... Args > 
void emplace_back(Args&&... args); 

這是一個可變參數模板,因此任何數量的參數(零個或多個)是可能的。右值引用來帶他們,並實現內部,你不得不調用使用std::forward,確保參數傳遞的,是構造函數:

(array+i) = new (pBuffer + i) T(std::forward<Params>(args)...); 

所以這仍然需要使用一個構造函數,但它留給調用者選擇構造函數(通過選擇參數)。如果沒有默認構造函數可用,調用者只需提供調用非默認構造函數所需的參數。

相關問題