Hacker News new | ask | show | jobs
by int_19h 2756 days ago
Deferring destructors is a suspicious pattern in general - in C++, I generally expect them to not be async and unpredictable like that. What guarantees do you make wrt destruction order? I hope it's not as complicated as finalizers in Java and C#...

The more logical model, to me, would be to have child views owned by parent views, and to only allow ownership-changing calls (i.e. adding or removing a child) from the main thread. That way all you really need is unique_ptr (from parent to children) and raw pointers (from children to parent, and from any observers). Although it would probably still be better to use shared_ptr just so that observers can use weak_ptr, since untangling lifetimes in callbacks can be tricky, and often it's easier to just check if the object is still there.

To give a specific code example, with unique_ptr, the same snippet would be:

    _window = std::make_unique<bdn::Window>();
    _window->setTitle("AwesomeApp");

    auto button = std::make_unique<bdn::Button>();
    button->setLabel("Hello World");

    // The following *moves* button, such that _window takes ownership over it.
    // It can only be called from the main thread.
    _window->setContentView(button); 

    _window->requestAutoSize();
    _window->requestCenter();
    _window->setVisible(true);
And furthermore, _window wouldn't have to be a pointer at all - it can just be a member of MainViewController.