gpt4 book ai didi

c++ - 如何清理失败的构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:03 25 4
gpt4 key购买 nike

假设我正在编写一个包含 C 风格 API 的类。

int cstyleInit()
int cstyleCleanup()

通常,方法是将 cstyleInit() 放在构造函数中,将 cstyleCleanup() 放在析构函数中,但我的问题是,我该如何处理构造函数中的初始化失败?

简单的方法是这样的:

MyWrapper::MyWrapper()  {
int ret = cstyleInit()
if (ret = FAILUREMODE1) {
cstyleCleanup();
throw exception("failure mode 1");
}
else if (ret = FAILUREMODE2) {
cstyleCleanup();
throw exception("failure mode 2");
}
...
}

据我所知,这可以正常工作。唯一的(小)问题是您必须为每种故障模式显式调用 cstyleCleanup(),这对我来说似乎不是很 RAII。

我知道这是一个小问题,但是否有更多的 c++/RAII 方法可以做到这一点?

最佳答案

The only (minor) issue is that you have to call cstyleCleanup() explicitly for each failure mode, which doesn't seem very RAII to me.

它实际上与 RAII 无关,但可能与在包装 API 以针对特定错误代码抛出异常时避免重复代码有关。
是否有类似 ret != NOFAILURE 的东西可用于此 API,使您能够独立于所有这些特化调用 cstyleCleanup();

MyWrapper::MyWrapper() {
int ret = cstyleInit()
if (ret != NOFAILURE) {
cstyleCleanup();
}
// Your exception mapping code ...
}

关于c++ - 如何清理失败的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24049836/

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