Указатели, которые вы возвращаете, бесполезны после возврата из функции. Аналогичная проблема в более простом коде:
int* dont_do_this(){
int x = 0;
return &x;
}
x
больше не существует, если функция вернула и у вас есть висячий указатель. Разыменование вызывает неопределенное поведение.
Это можно исправить, сделав x
static
:
int* maybe_do_this() {
static int x = 0;
return &x;
}
Теперь x
сохраняется между вызовами функций. Однако, даже если вы исправите это, ваша «фабрика» всегда будет возвращать указатели на одни и те же объекты. Если это то, чего вы хотите, вам вообще не понадобится фабрика. Предполагается, что фабрика создаст экземпляры и вернет их:
std::unique_ptr<Operation> OperationFactory:: CreateOperation(char opr) {
switch (opr) {
case '+':
return std::make_unique<OperationAdd>();
case '-':
return std::make_unique<OperationSub>();
// ...
default:
return std::make_unique<OperationDefault>();
}
}
Также вам нужно позаботиться о том, чтобы вернуть что-то во всех ветвях, и вы должны фактически использовать интеллектуальные указатели вместо необработанных указателей.