2015-10-22 91 views
4

的分配假設一個class X具有一個構造函數C++動態類陣列

創建一個指向X作爲X *ptr;爲類動態分配內存。

現在開始創建到現在爲止一切都很好的類X

ptr = new X[sizeOfArray]; 

的對象的數組。但是我想要做的就是創建上面的對象數組,應該調用構造函數。我試過如下:

ptr = new X(1,2)[sizeOfArray]; 

正如預期它給了我編譯時錯誤

error: expected ';' before '[' token|

如何創建對象的數組來調用構造函數?

SizeOfArray是用戶在運行時輸入的。

編輯: 我想在不可能的情況下達到什麼樣的效果,如天頂回答或太複雜。那麼我怎樣才能使用std::vector呢?

+1

爲什麼不'std :: vector'? – songyuanyao

+0

學校作業..不能使用STL。 – Pushkar

+1

對於編輯:'std :: vector xs(sizeOfArray,X(1,2));' – Jarod42

回答

5

這似乎是placement new工作...

這裏有一個基本的例子:

Run It Online !

#include <iostream> 
#include <cstddef> // size_t 
#include <new>  // placement new 

using std::cout; 
using std::endl; 

struct X 
{ 
    X(int a_, int b_) : a{a_}, b{b_} {} 
    int a; 
    int b; 
}; 

int main() 
{ 
    const size_t element_size = sizeof(X); 
    const size_t element_count = 10; 

    // memory where new objects are going to be placed 
    char* memory = new char[element_count * element_size]; 

    // next insertion index 
    size_t insertion_index = 0; 

    // construct a new X in the address (place + insertion_index) 
    void* place = memory + insertion_index; 
    X* x = new(place) X(1, 2); 
    // advance the insertion index 
    insertion_index += element_size; 

    // check out the new object 
    cout << "x(" << x->a << ", " << x->b << ")" << endl; 

    // explicit object destruction 
    x->~X(); 

    // free the memory 
    delete[] memory; 
} 

編輯:如果我理解你的編輯,你想要做這樣的事情:

Run It Online !

#include <vector> 
// init a vector of `element_count x X(1, 2)` 
std::vector<X> vec(element_count, X(1, 2)); 

// you can still get a raw pointer to the array as such 
X* ptr1 = &vec[0]; 
X* ptr2 = vec.data(); // C++11 
+0

'std :: aligned_storage'可能會有所幫助。但'std :: vector'更簡單。 – Jarod42

+0

'std :: aligned_storage'確實很有趣。從'std :: vector'開始,OP需要不使用它。此外,我認爲['std :: vector'確實使用了新的位置](https://en.wikipedia.org/wiki/Placement_syntax#Default_placement)。 – 865719

+0

請參閱編輯。我可能會嘗試'std :: vector',因爲這看起來太複雜了,無法遵循 – Pushkar

0

你不說如果sizeOfArray是一個變量或常量。如果它是一個(小)常數,你可以在C++ 11中做到這一點:

X* ptr = new X[3] { {1,2}, {1,2}, {1,2} }; 
+0

'SizeOfArray'是用戶在運行時輸入的 – Pushkar