简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM