这个ctor/ctor的使用是否正确?

Is this ctor / use of ctor correct?

    SingleMonitorInfo::SingleMonitorInfo(MONITORINFOEX* lpMONITORINFOEX)
    :rcMonitorArea(lpMONITORINFOEX->rcMonitor),
    rcWorkArea(lpMONITORINFOEX->rcWork),
    dwStatusFlags(lpMONITORINFOEX->dwFlags),
    szDeviceName({ '[=10=]' }),
    szMonitorName({ '[=10=]' }),
    szMonitorDescription({ '[=10=]' }),
    lpPixelArray(NULL)
{
    wcscpy_s(SingleMonitorInfo::szDeviceName, 33, lpMONITORINFOEX->szDevice);
    SingleMonitorInfo::setStringMonitorNameAndDescription(lpMONITORINFOEX->szDevice);
}

我正在使用成员初始化列表重写我的程序,我希望上面的代码是正确的,虽然这是我第一次使用成员初始化列表。

我后来意识到,在这个 class 的父级中:我正在创建另一个副本,一个副本来创建(我认为是实例化)列表。当我认为我需要的是:

for (int i = 0; i < lpMonitorList->iMaximumSize; i++)
    {
        smiMonitorList[i] = SingleMonitorInfo(&lpMonitorList->infoArray[i]);
    }

好像太简单了,容易验证错误,请问这个例子可以吗,如何在成员初始化中做简单的检查?据我了解,成员初始化列表可以执行逻辑 if 语句( X ? A : B ),但我无法理解如何验证输入。

编辑:我有一个默认构造函数并为 MONITORINFOEX 重载

SingleMonitorInfo::SingleMonitorInfo()
:dMaxPercentDifference(1), // Double
iCheckTaskbar(1), // int
rcMonitorArea(RECT{ 0, 0, 0, 0 }), // RECT
rcWorkArea(RECT{ 0, 0, 0, 0 }), // RECT
dwStatusFlags(DWORD(0x00000000)), // DWORD
dwCapabilitiesFlags(DWORD(0x00000000)), // DWORD
szDeviceName({ '[=12=]' }), // String (WCHAR)
szMonitorName({ '[=12=]' }), // String (WCHAR)
szMonitorDescription({ '[=12=]' }), // String (WCHAR)
lpPixelArray(NULL) // unsigned char*

{

}

应该没有必要在您的成员初始值设定项列表中执行检查,如果您需要执行检查,您可能需要重新考虑您的设计。

让我们看看你的 class:

SingleMonitorInfo::SingleMonitorInfo(MONITORINFOEX* lpMONITORINFOEX)
:rcMonitorArea(lpMONITORINFOEX->rcMonitor),
rcWorkArea(lpMONITORINFOEX->rcWork),
dwStatusFlags(lpMONITORINFOEX->dwFlags),
szDeviceName({ '[=10=]' }),
szMonitorName({ '[=10=]' }),
szMonitorDescription({ '[=10=]' }),
lpPixelArray(NULL)

如果lpMONITORINFOEXnullptr,我们可以看到一个很大的问题。看起来您的 class 需要 它才能正常工作。问问自己:我可以有一个没有 MONITORINFOEX 对象的 SingleMonitorInfo class 吗?

如果您的class需要该对象,请通过传递引用使其更加明确!

SingleMonitorInfo::SingleMonitorInfo(const MONITORINFOEX& lpMONITORINFOEX)
:rcMonitorArea(lpMONITORINFOEX.rcMonitor),
rcWorkArea(lpMONITORINFOEX.rcWork),
dwStatusFlags(lpMONITORINFOEX.dwFlags),
szDeviceName({ '[=11=]' }),
szMonitorName({ '[=11=]' }),
szMonitorDescription({ '[=11=]' }),
lpPixelArray(NULL)

您 class 的用户不能再错误地构造您的对象。如果出于某种原因 lpMONITORINFOEX 是可选的,并且需要保留一个指针,您可以简单地使用三元运算符 ?:

SingleMonitorInfo::SingleMonitorInfo(MONITORINFOEX* lpMONITORINFOEX)
:rcMonitorArea(lpMONITORINFOEX ? lpMONITORINFOEX->rcMonitor : nullptr),
rcWorkArea(lpMONITORINFOEX ? lpMONITORINFOEX->rcWork : false),
dwStatusFlags(lpMONITORINFOEX ? lpMONITORINFOEX->dwFlags : 0),
szDeviceName({ '[=12=]' }),
szMonitorName({ '[=12=]' }),
szMonitorDescription({ '[=12=]' }),
lpPixelArray(NULL)

显然我不知道你的对象是什么,所以我只是猜测默认输入。