[英]Calling overloaded constructors fails in if statement
So I have an if statement that decides whether one or another constructor is called. 因此,我有一个if语句来确定是否调用一个或另一个构造函数。 This is the code that gives me the error: 这是给我错误的代码:
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++ gives me these kinds of errors: 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{
^~~~~~~
However if I do it the naive way of creating redundant code it works perfectly. 但是,如果我这样做的话,创建冗余代码的幼稚方式就可以完美地工作。
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();
}
All I want to do is reduce the redundancy in my code and not have to write the .setFind() etc. part every time I need a different constructor. 我要做的就是减少代码中的冗余,而不必在每次需要其他构造函数时都编写.setFind()等部分。 I'm not sure how to solve this. 我不确定该如何解决。
What you can do to avoid code duplication is using a pointer and circumvent the deleted assignment operator: 为避免代码重复,您可以做的是使用指针并规避已删除的赋值运算符:
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();
By creating function: 通过创建函数:
void doJob(detect::Wrapper&& detector)
{
detector.setFind(findAlgNo);
detector.setLD(LDAlgNo);
detector.run();
}
You may then factorize your code to: 然后,您可以将代码分解为:
if (detectorFileNameSpecified){
doJob(detect::Wrapper(detectorFileName, saveImages, learnOrDetect, verbosity));
} else {
doJob(detect::Wrapper(saveImages, learnOrDetect, verbosity));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.