想象一下,我有一项工作要做,可以通过三种不同的方式完成:一种缓慢而痛苦但安全的方式;给予你适度痛苦的方式Resource1
;和一种快速简便的方法,它需要Resource1
和Resource2
。现在,这些资源很宝贵,所以我将它们包装成 RAII-implementingResNHolder
并编写如下内容:
void DoTheJob(Logger& log/*, some other params */) {
try {
Res1Holder r1(/* arguments for creating resource #1 */);
try {
Res2Holder r2(/* arguments */);
DoTheJobQuicklyAndEasily(log, r1, r2);
}
catch (Res2InitializationException& e) {
log.log("Can't obtain resource 2, that'll slowdown us a bit");
DoTheJobWithModerateSuffering(log, r1);
}
}
catch (Res1InitializationException& e) {
log.log("Can't obtain resource 1, using fallback");
DoTheJobTheSlowAndPainfulWay(log);
}
}
"DoTheJobXxx()" 引用Logger
/ ResNHolder
,因为它们是不可复制的。是我做得太笨了吗?有没有其他巧妙的方法来构造函数?