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

时间:2016-02-15 03:55:23

标签: c++ constructor initialization member

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

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

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

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

这似乎太简单了,容易出现验证错误,这个例子是否有效,以及如何在成员初始化中进行简单的检查?根据我的理解,成员初始化列表可以执行逻辑if语句(X?A:B),但我无法理解如何验证输入。

编辑:我有一个默认的ctor并为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({ '\0' }), // String (WCHAR)
szMonitorName({ '\0' }), // String (WCHAR)
szMonitorDescription({ '\0' }), // String (WCHAR)
lpPixelArray(NULL) // unsigned char*

{

}

1 个答案:

答案 0 :(得分:0)

在您的成员初始化列表中执行检查不是必需的,如果您需要执行检查,您可能需要重新考虑您的设计。

让我们看看你的课程:

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

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

如果您的班级需要该对象,请通过传递参考使其更明确!

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

您班级的用户无法再错误地构建您的对象。如果由于某种原因lpMONITORINFOEX是可选的,并且需要保留指针,则可以简单地使用三元运算符?:

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

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