Win32编程中使用了各种结构.很多时候只使用它们的一些字段而所有其他字段都设置为零.例如:
STARTUPINFO startupInfo; // has more than 10 member variables
ZeroMemory( &startupInfo, sizeof( startupInfo ) ); //zero out
startupInfo.cb = sizeof( startupInfo ); //setting size is required according to MSDN
startupInfo.dwFlags = STARTF_FORCEOFFFEEDBACK;
//Now call CreateProcess() passing the startupInfo into it
Run Code Online (Sandbox Code Playgroud)
我想停止复制粘贴这样的代码,而是使用一个关心归零和设置参数的抽象.让我们假设我只需要在示例中初始化结构,并且不需要其他调整.以下是一个很好的解决方案吗?有什么可能的问题?
class CStartupInfo : public STARTUPINFO {
public:
CStartupInfo()
{
ZeroMemory( this, sizeof( STARTUPINFO ) );
cb = sizeof( STARTUPINFO );
dwFlags = STARTF_FORCEOFFFEEDBACK;
}
};
Run Code Online (Sandbox Code Playgroud)
我特别关注ZeroMemory()调用 - 看起来我完全控制代码并且类没有vtable并且调用ZeroMemory()这种方式是安全的并且两个代码片段之间没有大的区别,除了后者提供抽象.有什么警告吗?
对于您可以做的结构:
STARTUPINFO startup_info = { sizeof(STARTUPINFO), 0 };
startup_info.dwFlags = STARTF_FORCEOFFFEEDBACK;
Run Code Online (Sandbox Code Playgroud)
我发现这是一种巧妙的技巧来初始化这些结构.然而,问题是cb(或大小/长度)字段必须是结构中的第一个字段.如果需要,你也可以只做扩展版本:
STARTUPINFO startup_info = { 0 };
startup_info.cb = sizeof(STARTUPINFO);
startup_info.dwFlags = STARTF_FORCEOFFFEEDBACK;
Run Code Online (Sandbox Code Playgroud)
如果你想用一个类包装结构,我建议你首先尝试ATL/WTL,因为你要包装的结构可能已经作为类存在了.
如果您仍然热衷于创建自己的类,我建议您创建一个构造函数,按顺序获取结构的每个元素,并指定默认参数,以便以后更容易更改这些值.