前言:
虽然我的答案仍然是好的,但我发现litb 的答案比我的要好,因为:
- 它教会了我一个我不知道的技巧(litb的答案通常有这个效果,但这是我第一次写下来)
- 它准确地回答了这个问题(即,将原始结构的部分初始化为零)
所以,请在我之前考虑一下 litb 的回答。事实上,我建议问题的作者将 litb 的答案视为正确的答案。
原始答案
将一个真正的对象(即std::string)等放入其中会破坏,因为真正的对象将在memset之前初始化,然后被零覆盖。
使用初始化列表对 g++ 不起作用(我很惊讶......)。而是在 CMyStruct 构造函数主体中对其进行初始化。它将是 C++ 友好的:
class CMyStruct : public MY_STRUCT
{
public:
CMyStruct() { n1 = 0 ; n2 = 0 ; }
};
PS:当然,我假设您确实无法控制 MY_STRUCT。通过控制,您将直接在 MY_STRUCT 中添加构造函数而忘记了继承。请注意,您可以将非虚拟方法添加到类似 C 的结构中,并且仍然让它像结构一样运行。
编辑:在 Lou Franco 的评论之后添加了缺少的括号。谢谢!
编辑 2:我在 g++ 上尝试了代码,由于某种原因,使用初始化列表不起作用。我使用主体构造函数更正了代码。不过,该解决方案仍然有效。
请重新评估我的帖子,因为原始代码已更改(有关更多信息,请参阅更改日志)。
编辑 3:阅读 Rob 的评论后,我想他有一个值得讨论的观点:“同意,但这可能是一个巨大的 Win32 结构,可能会随着新的 SDK 而改变,所以 memset 是未来的证明。”
我不同意:了解微软,它不会因为他们需要完美的向后兼容性而改变。他们将创建一个扩展的 MY_STRUCT Ex结构,其初始布局与 MY_STRUCT 相同,末尾有附加成员,并且可以通过“大小”成员变量(如用于 RegisterWindow、IIRC 的结构)来识别。
因此,Rob 的评论中剩下的唯一有效点是“巨大的”结构。在这种情况下,也许 memset 更方便,但您必须使 MY_STRUCT 成为 CMyStruct 的变量成员,而不是从它继承。
我看到另一个 hack,但我想这会因为可能的结构对齐问题而中断。
编辑 4:请查看 Frank Krueger 的解决方案。我不能保证它是可移植的(我猜是),但从技术角度来看它仍然很有趣,因为它展示了一种情况,在 C++ 中,“this”指针“地址”从其基类移动到其继承类.