В программировании 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
Я хочу, чтобы остановить копирование оклейки такого кода и вместо того, чтобы использовать абстракцию, которая будет заботиться о обнулении и настройки параметров. Предположим, мне нужна только структура, инициализированная, как в примере, и никакой другой настройки не требуется. Является ли следующее хорошее решение? Каковы возможные проблемы?
class CStartupInfo : public STARTUPINFO {
public:
CStartupInfo()
{
ZeroMemory(this, sizeof(STARTUPINFO));
cb = sizeof(STARTUPINFO);
dwFlags = STARTF_FORCEOFFFEEDBACK;
}
};
Я, в частности, обеспокоен ZeroMemory() вызов - похоже, я полностью контролировать код и класс не имеет виртуальные таблиц и вызов ZeroMemory() таким образом, является безопасным и нет большой разницы между этими двумя кроме того, что последний обеспечивает абстракцию. Есть ли какие-либо оговорки?
Возможно, я ошибаюсь, но эти классы, похоже, являются частью MFC? Если так, то это чертовски большая структура для использования для этого простого удобства. (Это и я сам человек ATL/WTL.) – Daemin
Структуры обложек DiLascia являются частью SDK Windows, если я не ошибаюсь, но этот метод можно использовать для любой структуры POD - он не привязан к MFC, ATL , или Windows. В статье DiLascia рассказывается о работе с некоторыми виджетами MFC - это не об обертывании структур в классе, который их использует. Обвязка структур - это просто техник, который он использует и упоминает в статье. –