Screen manager and its screens having access over the screen manager
I just happened to code my own StateMachine a week ago, which is similar to your ScreenManager, so here are my thoughts on the subject.

A vector of state can work, but I think using a stack instead saves you the index management. Also, the stack would resize itself during both pop and push operations.

A state (or a screen in your case) manages its own lifetime. As a consequence, it can remove itself from the stack during an update operation, and must survive until the next loop is processed. Thus, I choosed std::shared_ptr to work out this problem.

std::stack&lt;std::shared_ptr&lt;Screen&gt;&gt; _screens;


Since you're using C++11, the more you avoid manual dynamic allocations, the better. Using templates, you can use a safer way of creating your screen, and even provide parameters to them :

template&lt;typename Screen, typename... Args&gt;
void push_screen (Args &amp;&amp; ... args)
{
    if (!_screens.empty())
        _screens.top()-&gt;pause(); // Pause the current state

    _screens.emplace(std::make_shared&lt;Screen&gt;(std::forward&lt;Args&gt;(args)...));
    // Or, if you still use std::unique_ptr
    // _screens.emplace(new Screen { std::forward&lt;Args&gt;(args)... }); // C++11
    // _screens.emplace(std::make_unique&lt;Screen&gt;(std::forward&lt;Args&gt;(args)...)); // C++14
    _screens.top()-&gt;enter(); // Start the new state
}


This way, you can pass a reference of your ScreenManager and avoid using a bare pointer.

push_screen&lt;MainMenuScreen&gt;(*this);