Как сослаться и изменить базовое значение std :: unique_ptr в другой функции? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь изменить значение в unique_ptr, но внутри другой функции, которая на самом деле не владеет unique_ptr, следующим образом:

void my_func(Foo* foo) {
  foo->set_bar("a");
} 

int main() {
  auto foo = std::MakeUnique<Foo>();

  my_func(foo.get());

  cout << foo->bar;
}

Я думал, что это будет работать, кроме меняс ошибкой жалобы на удаленный конструктор.Есть ли способ заставить этот шаблон работать?

1 Ответ

0 голосов
/ 29 ноября 2018

Я предполагаю, что вы на самом деле используете std::make_unique<Foo>().

Так как это ошибка в конструкции, это, скорее всего, проблема с типом Foo, а не с тем, что вы пытаетесь сделать сЭто.Хотя это также может происходить из функции set_bar().

Использование std::make_unique<Foo>() попытается использовать конструктор по умолчанию (тот, что не имеет аргументов).Может показаться, что ваш тип Foo не имеет конструктора по умолчанию.Хотя, без реализации Foo под рукой, это всего лишь предположение.Вам нужно дать std::make_unique<Foo>() аргументы, которые соответствуют одному из определенных конструкторов Foo 1 .

Re: Что вы пытаетесь сделать - похоже, это должно сработать.Хотя, поскольку он принимает необработанный указатель, вам следует рассмотреть возможность выполнения некоторых проверок nullptr.

1: если определен хотя бы один конструктор, где он не является конструктором по умолчанию, конструктор по умолчанию удаляется .

...