#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. Моя ошибка исправлена. Спасибо за ваш ответ