在 if 语句中调用重载构造函数失败



所以我有一个 if 语句来决定是调用一个还是另一个构造函数。这是给我错误的代码:

detect::Wrapper detector;
if (detectorFileNameSpecified){
detector = detect::Wrapper(detectorFileName,
saveImages,
learnOrDetect,
verbosity);
}
else {
detector = detect::Wrapper(saveImages,
learnOrDetect,
verbosity);
}
detector.setFind(findAlgNo);
detector.setLD(LDAlgNo);
detector.run();

G++给了我这些类型的错误:

main.cpp:126:15: error: use of deleted function ‘detect::Wrapper& detect::Wrapper::operator=(detect::Wrapper&&)’
verbosity);
^
In file included from main.cpp:1:0:
wrapper.hpp:14:9: note: ‘detect::Wrapper& detect::Wrapper::operator=(detect::Wrapper&&)’ is implicitly deleted because the default definition would be ill-formed:
class Wrapper{
^~~~~~~

但是,如果我以创建冗余代码的天真方式执行此操作,它可以完美运行。

if (detectorFileNameSpecified){
detect::Wrapper detector(detectorFileName,
saveImages,
learnOrDetect,
verbosity);
detector.setFind(findAlgNo);
detector.setLD(LDAlgNo);
detector.run();
}
else {
detect::Wrapper detector(saveImages,
learnOrDetect,
verbosity);
detector.setFind(findAlgNo);
detector.setLD(LDAlgNo);
detector.run();
}

我想做的只是减少代码中的冗余,而不必在每次需要不同的构造函数时编写 .setFind(( 等.part。我不知道如何解决这个问题。

通过创建函数:

void doJob(detect::Wrapper&& detector)
{
detector.setFind(findAlgNo);
detector.setLD(LDAlgNo);
detector.run();
}

然后,您可以将代码分解为:

if (detectorFileNameSpecified){
doJob(detect::Wrapper(detectorFileName, saveImages, learnOrDetect, verbosity));
} else {
doJob(detect::Wrapper(saveImages, learnOrDetect, verbosity));
}

为了避免代码重复,你可以做的是使用指针并绕过已删除的赋值运算符:

std::unique_ptr<detect::Wrapper> detector; // <<<<<<<<<<<
if (detectorFileNameSpecified){
detector = std::make_unique<detect::Wrapper>(detectorFileName,
saveImages,
learnOrDetect,
verbosity);
}
else {
detector = std::make_unique<detect::Wrapper>(saveImages,
learnOrDetect,
verbosity);
}
// Note the -> to dereference    
detector->setFind(findAlgNo);
detector->setLD(LDAlgNo);
detector->run();

最新更新