Я наткнулся на, вероятно, тривиальную проблему. Я хочу вызвать doSomething()
для экземпляра AbstractParser
, где указанный экземпляр имеет производный класс FooParser
или BarParser
. Будет ли это один или другой, зависит от аргументов времени выполнения, предоставленных пользователем. Оставшаяся часть кода должна иметь только способ доступа к родительскому объекту AbstractParser
. См. Ниже.
AbstractParser& myParser; // Error: can't have a reference to nothing
if(some_condition){
FooParser parser = FooParser();
myParser = parser;
}else{
BarParser parser = BarParser();
myParser = parser;
}
// lots of code with other things ...
parser.doSomething();
Исходя из условия, я хочу использовать myParser
(или указатель на него) вне области действия if
блока, а myParser
должен вести себя как соответствующий производный объект. Я хочу избежать копирования моего объекта и (если возможно) конструктора перемещения. Без условия я мог бы сделать это
FooParser parser = FooParser();
AbstractParser &myParser = parser; // upcast without slicing
// lots of code with other things ...
parser.doSomething();
И это было бы чисто и элегантно, с удручающей скоростью без нарезки parser
. Я не уверен, как это сделать сейчас.
Как я могу выгружать свои производные парсеры, не копируя созданные объекты или не выводя их go из области видимости? Нужно ли создавать std::unique_ptr<AbstractClass>
и использовать make_unique<FooParser>()
внутри if
? Или я должен использовать функцию, которая возвращает ссылку на производный класс? Или static_cast<AbstractClass>
? Или я это слишком усложняю?