这个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)
如果lpMONITORINFOEX
是nullptr
,我们可以看到一个很大的问题。看起来您的 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)
显然我不知道你的对象是什么,所以我只是猜测默认输入。
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)
如果lpMONITORINFOEX
是nullptr
,我们可以看到一个很大的问题。看起来您的 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)
显然我不知道你的对象是什么,所以我只是猜测默认输入。