c++ - 避免在 C++ 中使用默认构造函数进行初始化

标签 c++ gcc clang

我需要确保构造函数不会初始化某些成员变量:

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->av->b。我应该怎么做?

一个讨厌的 hack 是将所需的 v->av->b 值存储在线程局部变量中,然后将它们复制到 A::A()。但是,如果 B 的构造函数创建了另一个 A,这将不起作用,所以我需要一堆它们。有没有更快的方法?

最佳答案

您可能无法保证“旧的”A 在不诉诸非标准方法(也称为“讨厌的黑客”)的情况下保持不变,因为通常允许编译器准备您的新的、未初始化的A 它认为合适。

这是我的建议,但是它非常不安全,它依赖于未定义的行为并且只有当 AB 都具有标准布局(没有 虚拟函数等):

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/

相关文章:

Linux 的 C++ 调试器类似于 MS Visual Studio 的调试器?

c++ - 在简单的 cpp 类构造函数中处理错误

c - 如何在更高版本的 gcc 上启用 c11?

ubuntu - gfortran 编译目标文件错误 crt1.o : In function `_start' :

linux - 如何在 gcc4.9 中设置 GCC_COLORS 以发出彩色诊断消息?

python - 使用 libclang 进行函数边界识别

c++ - 使用 Clang 构建 C++ 静态库时的奇怪行为

initializer_lists 平均值的 C++11 通用函数

c++ - 在构造函数上指定 constexpr 是否会自动使从它创建的所有对象都是 constexpr?

c - 可变参数宏:粘贴 token 的扩展