У меня есть класс Widget, который должен иметь уникальное право собственности на другой виджет. Я хочу реализовать функцию, которая передает этот виджет другому виджету. Я узнал, что лучший способ реализовать концепцию единого владения std::unique_ptr
, однако я не могу заставить его работатьПередача std :: unique_ptr между Widgets
Это код:
class Widget
{
public:
Widget(void) { }
virtual ~Widget(void) { /* */ }
void successor(Widget&& successor)
{
this->_successor = std::unique_ptr<Widget>(&successor);
}
void refer_value(int a)
{
_successor->value = a;
}
auto refer_value(void) const -> int
{
return _successor->value;
}
auto get(void) -> Widget&
{
return *_successor;
}
int value;
private:
std::unique_ptr<Widget> _successor;
};
Он компилирует без проблем, но когда я попробуйте запустить это:
int main(void)
{
Widget a{};
Widget b{};
Widget c{};
a.successor(Widget{});
a.refer_value(5);
b.successor(std::move(a.get()));
std::cout << b.refer_value();
}
Я получаю ошибку сегментации. В чем проблема?
И дополнительно, как бы мне пришлось написать реализацию функции successor(), если бы я хотел передать Widget c
. Я мог бы запустить его только для rvalues.
Я хочу, чтобы гарантировать, что точки нет двух виджетов в одном виджете. Однако, когда я вызываю 'std :: cout << a.refer_value();' в вашем коде, я также получаю 5. – hgiesel
@henrikgiesel Вы можете сделать ':: get()' return 'std :: shared_ptr &', а затем 'move()' it в 'b.successor()'. Однако тогда 'a.refer_value()' будет разыменовывать нулевой указатель, поэтому вам нужно следить за этим. –
Думаю, я мог бы обойти это, называя указатель 'operator bool' на указателе. Однако мне все равно понравится решение для 'std :: unique_ptr' – hgiesel