如何使用参数化构造函数动态分配对象数组?

时间:2013-03-11 05:54:36

标签: c++ dynamic-allocation

考虑一个简单的类:

class SimpleClass {
    int a;
public:
    SimpleClass():a(0){}
    SimpleClass(int n):a(n){}
    // other functions
};

SimpleClass *p1, *p2;

p1 = new SimpleClass[5];

p2 = new SimpleClass(3);

在这种情况下,调用默认构造函数SimpleClass()来构造p1的新分配对象和p2的参数化构造函数。我的问题是:是否可以使用new运算符分配数组并使用参数化构造函数?例如,如果我希望使用变量a值分别为10,12,15,...的对象初始化数组,是否可以在使用new运算符时传递这些值?

我知道使用stl向量是处理对象数组的更好主意。我想知道上面是否可以使用new来分配数组。

2 个答案:

答案 0 :(得分:7)

您可以将 placement-new 用作:

typedef std::aligned_storage<sizeof(SimpleClass), 
                             std::alignment_of<SimpleClass>::value
                             >::type storage_type;

//first get the aligned uninitialized memory!
SimpleClass *p1 = reinterpret_cast<SimpleClass*>(new storage_type[N]);

//then use placement new to construct the objects
for(size_t i = 0; i < N ; i++)
     new (p1+i) SimpleClass(i * 10);

在此示例中,我将(i * 10)传递给SampleClass的构造函数。

希望有所帮助。

答案 1 :(得分:1)

这是一种方法,但它并不完全是你通过新的SimpleClass [5]实现的,因为它创建了一个指针数组而不是一个值数组:

SimpleClass *p[] = {
    new SimpleClass(10), 
    new SimpleClass(12), 
    new SimpleClass(15)
};

为了达到你想要的效果,我推荐类似的代码:

SimpleClass *p2 = new SimpleClass[3];
SimpleClass *pp = p2;
*pp = 10;
*++pp = 12;
*++pp = 15;

它并不理想,因为它会在堆栈和调用赋值运算符上创建临时对象,但从代码角度看它看起来很干净。这里牺牲了性能。