Supposons que j'ai une classe C ++ de style Raii: ... pour être utilisée comme dans mon code: p> ... L'objectif étant d'entrer dans certains états, de faire des choses, puis de quitter cet état lorsque je quitte cette portée. Existe-t-il un moyen de rendre cette faute de frappe non compilée (ou de se plaindre ou d'une manière ou d'une autre pour que l'erreur puisse être remarquée)? P> void Manipulate()
{
StateSaver(1); // ruh-roh, state saved and immediately restored!
// ...do stuff that modifies state
}
4 Réponses :
Il y a très peu de choses que vous pouvez faire pour empêcher les autres (ou vous-même, FTM) de faire autre chose qu'ils ne le souhaitaient. La seule chose à laquelle je puisse penser ne pas écrire le code lui-même, mais écrire une macro à la place. P> Savematrix Enregistrer (); code> ne définit pas un objet non plus. Il déclare une fonction.
#define SAVE_MATRIX SaveMatrix save ## __LINE__
Je ne sais pas si quelque chose peut être fait à la compilation. Pour un chèque de temps d'exécution, vous pouvez le faire:
SaveMatrix sm(sm);
Nice, semble un peu bizarre au début, mais pourrait faire partie du Raii-idiome, car la question montrait un véritable problème avec C ++ / Raii. Je préférerais avoir un peu de cruft de savoir que mon verrou ne fonctionnait pas à cause de cela.
HM, des options que je pense que j'aime ça le meilleur. Ce n'est pas tout à fait naturel, mais encore une fois, Raii lui-même n'est pas entièrement naturel non plus, du moins pas si vous pensez que des classes principalement comme des structures - avec l'initialisation et le nettoyage. Merci!
La classe ne peut jamais dire si elle était instanciée comme une variable temporaire (Savematrix ()) ou comme variable (Savematrix Save;). Je pense que la meilleure façon d'arrêter le programmeur de faire cela sans pile ni macro hacks est de forcer une fonction de membre appeler après la construction, par exemple: ceci fonctionne ensuite comme suit: P> < Pré> xxx pré> p>
Que raii (). DO () code> échoue ne semble pas un problème ici. Afaiu, l'OP tente de couper ce mec Murphy, pas Machiavel.
Je devais en fait modifier Ma solution dans un tas de façons de La variante Waldo posté, mais ce que j'avais finalement eu est une version macro-ized de:
Savematrix (): -> ressemble à une fonction appelée à moi.
Savematrix Save (): -> ressemble à une déclaration de fonction pour moi.