It really boils down to what these classes represent.
If these classes represent systems of your game such as Rendering or Sound, you can easily get by with this type of initialization structure. Even as you start adding systems to your game like networking, it's acceptable to simply leave these as member variables of a framework-like class because you often need to refer to these systems directly to use their exposed interface API and placing them into a list only adds unnecessary complexity. Nothing would stop you from having them derive from a common ISystem class though and keeping them in a list, but having specific references would minimize that list's lookup time when they were needed at the cost of a few bytes of memory.
If these classes represent game objects, or what I call entities, then generally there is a core system that is responsible for managing these instances. You simply ask this system to create you an instance, it wires it up and manages the memory and simply hands you back a reference to work with. For example:
// Game Object System Interface
struct IGameObjectSystem {
// Create game object with a specified name
GameObject* Create(const std::string& name="");
// Create game object based on a template type with a given name
GameObject* Create(unsigned int templateTypeId, const std::string& name="");
// Create game object with given parameter list
GameObject* Create(ParameterList& params);
// Deallocates a game object
void Destroy(GameObject* object);
};
class GameObjectSystem : public IGameObjectSystem {
public:
/* implement the IGameObjectSystem here */
private:
std::vector<GameObject*> mObjects; // list of objects in use
static unsigned int mNextObjectId; // next object id to assign
};
The benefit is that now you can create as many game objects as you want. You could go as far as creating Factory classes for all the various types of game objects in your game and then this object system can use those factories to create a specific type of game object. You've centralized the creation/destruction of game objects and abstracted away storing them in a list too.
But keep in mind this is only one way to manage Game Objects.
As Mihai points out, Component-based design often has varying designs around game objects. Some prefer to have a GameObject class like the above examples which has a collection of components that make up it's feature-set while other implementations prefer to treat game objects as simple unsigned int values that reference specific indexes in a well designed system of arrays to quick, constant time lookups and retrieval.
The great part of all this is there is no real "right" way that works. There are some best practices but even those are going to vary from implementation to implementation all depending upon the framework being used - is it built in-house or licensed, etc. But don't be afraid to go with what works for now and improve upon it later as you get a better idea of how things all come together.