• [^] # Re: Compréhension

    Posté par (site web personnel) . En réponse au journal Visiteurs en C++. Évalué à 2.

    Non, rien à voir. le type de retour dans ce cas là serait l'équivalent du type de retour de ta fonction virtuelle.

    L'interrêt ici est plutot de séparé le code et les données.

    Exemple fréquent dans un compilateur: tu as une classe de base (Statement) et des classe dérivée (IfStatement et ForStatement)

    Ensuite tu veux écrire des passe d'optimisation, tu pourrais aoir quelque chose comme ça:

    // Statement.h
    class Statement { 
     /*... */
     virtual void optimizeConstantPropagation() = 0;
     virtual void optimizeDeadCode() = 0;
    };
    // IfStatement.h
    class IfStatement : Statement {
     /* ... */
     virtual void optimizeDeadCode() {
     if (condition->isConstant()) { /*..remove one branch of the if .. */ }
     // recurse
     condition->optimizeDeadCode();
     thenBranch->optimizeDeadCode();
     elseBranch->optimizeDeadCode();
     }
    };
    
    

    On voit deux problème:
    1. la partie 'recurse' devra être répété dans toutes les passes d'optimisation.
    2. Si je veux créé une nouvelle passe d'optimisation, je dois rajouter une fonction dans toute les classes. Alors que justement, les passes d'optimisations devraient être modulaire et contenue dans un seul fichier.

    Le visiteur pattern permet de résoudre ces deux problèmes.