我需要确保构造函数不会初始化某些成员变量:
struct A{
int a, b;
};
struct B: A{
int c;
B():c(42){}
}
char data[sizeof(B)];
B *v=reinterpret_cast<B*>(data);
v->a=42;
v->b=42;
new (v) B;
我希望 A 的定义方式是放置新运算符不修改 v->a
和 v->b
。我应该怎么做?
一个讨厌的 hack 是将所需的 v->a
和 v->b
值存储在线程局部变量中,然后将它们复制到 A::A()
。但是,如果 B
的构造函数创建了另一个 A
,这将不起作用,所以我需要一堆它们。有没有更快的方法?
最佳答案
您可能无法保证“旧的”A
在不诉诸非标准方法(也称为“讨厌的黑客”)的情况下保持不变,因为通常允许编译器准备您的新的、未初始化的A
它认为合适。
这是我的建议,但是它非常不安全,它依赖于未定义的行为并且只有当 A
和 B
都具有标准布局(没有 虚拟
函数等):
char data[sizeof(B)];
// initialize your A object at *data
class B_minus_A {
int c;
}
new (v+sizeof(A)) B_minus_A; // (beware the alignment issues!)
B *v=reinterpret_cast<B*>(data);
另外,一种正统的方法是为 B
创建一个构造函数,接受一个 A
参数,并将它传递给它的 A
对象覆盖。这保证有效,明显的缺点是你支付了两份拷贝的费用(从 *data
到 B 的构造函数的参数堆栈,反之亦然),并且你必须被允许修改源B
的代码。
关于c++ - 避免在 C++ 中使用默认构造函数进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29447214/