为数组的每个元素调用构造函数

时间:2014-03-16 23:05:54

标签: c++ constructor

class K {
public:

    K(int a, int n) : n(n) {
    }


    static void allocate(unsigned number, unsigned n) {
        K* w = reinterpret_cast<K*> (::operator new( sizeof (K) * number)); 

        for (int i = 0; i < number; i++) {
            new( (void*) (w + i))K(24, n);
            //(w)->K::K(24,n);

        }
    }
private:


    const int n;

};
  1. 为什么第一种方式(new((void *)(w + i))K(24,n);)不会产生错误而第二种方式((w) - &gt; K :: K(24 ,n);)犯错误?最终,如何修复它?
  2. Tha allocate是静态的,为什么我可以访问私有的n?

2 个答案:

答案 0 :(得分:3)

我要说明我对你尝试做什么的理解,这对受访者来说并非100%明确。由于您没有类的默认构造函数,因此无法使用new []在数组中分配它们。您的办法是使用placement new手动调用构造函数。

通常,尝试为需要使用new []分配的类创建默认构造函数。然后你可以在分配它们之后再更新它们。这更简单,更容易阅读。例如,w = new K[number];delete[] w;会为您处理所有内容,但它只能调用默认构造函数。所以你必须做&#34;建设初始化&#34;用你自己的功能来设置你想要的方式。

如果你真的想使用placement new来调用各个构造函数,你可以并且它是安全的。它不是我推荐的设计,但它也不像有些人想象的那样邪恶。您的代码有效,但在您完成后不会对w执行任何操作,因此它会泄漏...但是在调试器中检查它,它已经调用了构造函数每一个,就像你想要的那样。您应该注意到您在不同的范围内重用n,这令人困惑。你应该消除歧义。来自n的{​​{1}}正被送入每个构造函数。

另外一个重要的注意事项,这就是在这里使用placement new的设计的缺点。你必须:

  1. 完成后,手动调用每个元素上的析构函数。因此,您必须手动跟踪阵列的长度,直到释放。
  2. 免费allocate分配的匹配方式。如果您没有使用w,请不要使用delete[]

答案 1 :(得分:0)

static成员可以访问其类型的任何实例的private数据。 Dem的规则。

但是,在这里,您正在使用函数参数。

我甚至不会评论你的精神记忆分配。