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;
};
答案 0 :(得分:3)
我要说明我对你尝试做什么的理解,这对受访者来说并非100%明确。由于您没有类的默认构造函数,因此无法使用new []在数组中分配它们。您的办法是使用placement new手动调用构造函数。
通常,尝试为需要使用new []分配的类创建默认构造函数。然后你可以在分配它们之后再更新它们。这更简单,更容易阅读。例如,w = new K[number];
和delete[] w;
会为您处理所有内容,但它只能调用默认构造函数。所以你必须做&#34;建设初始化&#34;用你自己的功能来设置你想要的方式。
如果你真的想使用placement new来调用各个构造函数,你可以并且它是安全的。它不是我推荐的设计,但它也不像有些人想象的那样邪恶。您的代码有效,但在您完成后不会对w
执行任何操作,因此它会泄漏...但是在调试器中检查它,它已经调用了构造函数每一个,就像你想要的那样。您应该注意到您在不同的范围内重用n
,这令人困惑。你应该消除歧义。来自n
的{{1}}正被送入每个构造函数。
另外一个重要的注意事项,这就是在这里使用placement new的设计的缺点。你必须:
allocate
分配的匹配方式。如果您没有使用w
,请不要使用delete[]
。答案 1 :(得分:0)
static
成员可以访问其类型的任何实例的private
数据。 Dem的规则。
但是,在这里,您正在使用函数参数。
我甚至不会评论你的精神记忆分配。