Ошибка в реализации шаблона стратегии в C

#c #linux #c 11

#c #linux #c 11

Вопрос:

Я пытаюсь реализовать стратегию шаблона проектирования на C . Цель для меня — выполнить операцию над 2 числами.

Вот мой класс контекста

   operation::operation(std::unique_ptr<calculatorTask> pTask = nullptr)
{
    pCalculatorTask = std::move(pTask);
}

operation::~operation();
{
}

void operation::setTask(std::unique_ptr<calculatorTask> pTask)
{
    this->pCalculatorTask = std::move(pTask);
}

void operation::executeTask(numberMsgamp; sValues)
{
    pCalculatorTask->calculate(values);
}
 

Это моя реализация :

 int main()
{
   std::vector<std::unique_ptr<calculatorTask>> myOperation;
   myOperation.push_back(std::move(std::unique_ptr<additionTask>(new additionTask())));
   myOperation.push_back(std::move(std::unique_ptr<substractionTask>(new substractionTask())));
   for (const auto amp;Ope : myOperation)
    {
        pOpe->setTask(Ope);
        [...]
    }
}
 

У меня есть эта ошибка :

ошибка: использование удаленной функции ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>amp;) [с _Tp = calculatorTask; _Dp = std::default_delete]’ pOpe->Настройка задачи (Ope);

Я не понимаю ошибки и как ее исправить.

Комментарии:

1. setTask принимает unique_ptr , пока вы хотите передать (const) unique_ptramp; . В такой ситуации C пытается создать копию, но, очевидно unique_ptr , не может быть скопирован. С вашим дизайном что-то не так: setTask требуется владение, но вы создаете std::vector unique_ptr . Похоже, у меня два владельца. Чего именно вы пытаетесь достичь? Возможно, вы хотите использовать shared_ptr вместо этого?

2. @причудливый. Я переработал свой дизайн, заменил unique_ptr на shared_ptr. Моя ошибка исправлена. Спасибо за ваш ответ