I don't think that you have to do many changes. Of course you can read millions of articles, but probably your game will never be finished
.
My suggestion is: Just try to do it your way and you will see, what are the assets and drawbacks and you will maybe use another system in your next project - or not, if your system works well for you.
What you want to do is probably programming a game and not winning design contests(of course a good design is necessary, but I don't think your design is that bad).
To solve your problem there are two solutions.
First:
Do not use any pointers. Just save a copy of the objects in your list. So you can create temporarily objects and they will be copied to the list and the old object will be deleted, but your copy will still remain. But in that case: Use references to get your objects from the list.
A small example:
class object_manager
{
public:
object& get_object( unsigned int index );
private:
std::list<object> objects;
}
Second:
You can still use pointers, but have to use pointers, if you create an object, too.
Example:
player* tmp_player = new player( sf::Vector2<float>(10,10), sf::Sprite(sub), &world.GetWindow()->GetInput(), world.GetWindow());
world.entityList.push_bakc(tmp_player);
But you have to delete the memory, if you want to delete an object(or all objects at the end of the game). Therefore simply call delete before removing an entity from your list.
Another point you have to think about is your image-management. In your code you're creating a temporary image "sub", which is destroyed, if the scope is left. The sprite would probably displayed as a white rectangle. So you should save your images as well. I wrote a tutorial about an image-manager a few months ago in the wiki:
Have a look at it.I don't think that you should read much about design-patterns but rather read some stuff about memory-handling in C++.