Il y a un autre cas d'école où tu dois utiliser les pointeurs : lorsqu'on utilise des classes abstraites pures. Là, on ne peut pas créer d'objet correspondant à la classe abstraite pure, et donc il faut passer par des pointeurs.
Exemple : reprenons l'histoire de la fenêtre. Ta fenêtre, c'est moralement une liste des Chose de afficher, la Chose pouvant être un Bouton, un pavé de Texte, une Image, un Containeur servant à organiser le positionnement de choses qu'il contient, etc. Tu ne peux pas stocker dans une même liste un objet de type Bouton et un objet de type Image (on ne mélange pas les serviettes et les torchons, pardi !)
On s'en sort par exemple en faisant comme suit :
class Chose
{
public:
virtual ~Chose() {}
virutal void draw() const =0;
};
// NB: pas de constructeur pour Chose, car de toute façon on
// ne peut pas créer de Chose, seulement des Chose* à cause du "=0"
class Bouton : public Chose
{
private:
std::string text;
public:
Bouton(string s) : text(s) {}
void draw() const { ... }
};
Puis pour la fenêtre, on va définir une
std::list<Chose*> l;
sur laquelle on pourra faire un
l.push_back(new Bouton("toto"));
pour ajouter un bouton à la fenêtre.
PS: avec un peu de chance, j'ai pas trop merdé niveau syntaxe. 