【问题标题】:How to dynamically allocate array of objects using parameterized constructor? [duplicate]如何使用参数化构造函数动态分配对象数组? [复制]
【发布时间】:2013-02-26 05:51:18
【问题描述】:

考虑一个简单的类:

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 vector 是处理对象数组的更好主意。我想知道上面是否可以使用 new 来分配数组。

【问题讨论】:

  • 您可以使用初始化列表,尽管它不能很好地扩展。使用向量,它只是一个大小+值的构造函数。

标签: c++ dynamic-allocation


【解决方案1】:

您可以使用 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 的构造函数。

希望对您有所帮助。

【讨论】:

  • 我收到以下错误 test.cpp:16: error: expected initializer before ‘&lt;’ token 其中 16 是 typedef 行
  • @uba: #include &lt;type_traits&gt; 并在 C++11 模式下编译。
【解决方案2】:

这是一种方法,但它并不完全是您通过 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;

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

【讨论】:

  • 现有代码还是很有可能的:p1 = new SimpleClass[5]{1, 2, 3, 4, 5};
  • 是的,没错。我实际上也在创建一个指针数组。
  • @chris,等一下,您的代码无法编译。错误 C2143:语法错误:缺少“;”在“{”之前
  • @evpo,啊,看起来像是 C++11 的特性。不过,它肯定会调用适当的构造函数五次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多