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

5

考虑一个简单的类:

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);

在这种情况下,对于新分配的对象p1会调用默认构造函数SimpleClass(),对于p2则会调用参数化构造函数。我的问题是:是否可能使用new运算符分配数组并使用参数化构造函数进行初始化?例如,如果我希望该数组被初始化为具有变量a值分别为10、12、15等的对象,是否可以在使用new运算符时传递这些值?
我知道使用STL向量来处理对象数组是一个更好的方法。但我想知道是否可能使用new来分配数组实现上述操作。

1
你可以使用初始化列表,但它并不是非常适用于大规模数据。使用向量,则可以使用大小+值的构造函数。 - chris
2个回答

7

您可以使用放置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 的构造函数。 希望这有所帮助。

我收到了以下错误:test.cpp:16: error: expected initializer before ‘<’ token,其中16是typedef行。 - uba
@uba:在C++11模式下包含<type_traits>头文件并编译。 - Nawaz

1
这是一种方式,但它并不完全等同于使用new 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;

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


1
@chris,等一下,你的代码编译不通过。错误 C2143:语法错误:在 '{' 之前缺失 ';'。 - evpo
@evpo,啊,看起来这是C++11的一个特性。虽然它确实调用了适当的构造函数五次。 - chris
@chris:不是C++11的特性。 - Nawaz
@chris:标准允许这样吗?我不认为是。也许这是一种扩展? - Nawaz
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接