7
votes

Est-il possible d'empêcher une classe de style Raii d'être instanciée "anonymement"?

Supposons que j'ai une classe C ++ de style Raii: xxx pré>

... pour être utilisée comme dans mon code: p> xxx pré>

... 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
}


2 commentaires

Savematrix (): -> ressemble à une fonction appelée à moi.


Savematrix Save (): -> ressemble à une déclaration de fonction pour moi.


4 Réponses :


6
votes

Savematrix Enregistrer (); code> ne définit pas un objet non plus. Il déclare une fonction.

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>

#define SAVE_MATRIX SaveMatrix save ## __LINE__


0 commentaires

10
votes

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);


2 commentaires

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!



1
votes

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: xxx

ceci fonctionne ensuite comme suit: < Pré> xxx


1 commentaires

Que raii (). DO () échoue ne semble pas un problème ici. Afaiu, l'OP tente de couper ce mec Murphy, pas Machiavel.



3
votes

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: xxx


0 commentaires