gpt4 book ai didi

c++ - 如何创建一个在失败时创建空对象的构造函数 (c++)?

转载 作者:行者123 更新时间:2023-11-30 03:01:53 32 4
gpt4 key购买 nike

如何创建一个在失败时创建空对象的构造函数 (c++)。

我想创建一个行为类似于 DicomImage 的类来自 DCMTK 的类(class)图书馆。

#include "diregist.h"   /* required to support color images */
DicomImage *image = new DicomImage("test.dcm");

if (image != NULL)
{
if (image->getStatus() == EIS_Normal)
{
Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 /* bits per sample */));

if (pixelData != NULL)
{
/* do something useful with the pixel data */
}
}
else
cerr << "Error: cannot load DICOM image (" << DicomImage::getString(image->getStatus()) << ")" << endl;
}
delete image;

最佳答案

不容易。您可以在 DicomImage 类的声明中覆盖 DicomImage::operator new()。然后可能会失败并返回 NULL 的实际逻辑将进入 operator new() 主体,而不是实际的构造函数。一旦进入构造函数,返回 NULL 为时已晚,此时对象已经创建。问题是 operator new() 不接收构造函数参数,因此您可能没有失败所需的信息。

另一种方法是让工厂方法或工厂类实际创建您的实例,因此您的代码如下所示:

DicomImage* pImage = CreateDicomImage( "stuff" );

但是因为您的问题中包含“异常处理”...并且至少要使答案更适合程序员 SE(而不是 stackoverflow)问题,我确实想指出您可以而且应该利用 C++ 中的异常处理。

当您返回 NULL 时,您会强制所有客户端代码在调用 new DicomImage() 之后立即添加错误检查逻辑,这会降低可读性,因为错误检查往往最终会与实际应用程序逻辑混合在一起。

如果代码看起来像这样会不会更好:

std::unique_ptr< DicomImage > pImage( new DicomImage( "stuff" ) );
pImage->DoSomeCommand();
pImage->DoSomeOtherCommand();

... 如果创建失败,则不必担心“假设”条件。您可以通过使用 C++ 异常处理并在创建失败时让构造函数抛出异常来实现这一点。在处理这些东西的代码块周围设置 try-catch block ,try block 中的内容是纯应用程序逻辑。没有错误检查污染代码,如果图像创建失败也没有崩溃。

...并且通过使用智能指针,您还可以保证如果以后出现任何问题,pImage 将始终被删除。因此,您永远不必担心在退出函数之前必须调用 delete。

关于c++ - 如何创建一个在失败时创建空对象的构造函数 (c++)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10662873/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com