10
votes

Classe sans données de données en C ++

Cela peut ne pas être une question spécifique à C ++ et plus à voir avec la programmation orientée objet. Je suis nouveau à cela et je doute de mon design. J'ai une classe parser qui implémente de nombreuses fonctions traitant des expressions d'analyse, de la conversion de l'infixe sur Postfix, etc. J'utilise ces fonctions Parser dans la fonction principale. J'ai réalisé que je n'ai pas besoin de membres de données pour cette classe. Par conséquent, je n'ai pas vraiment besoin d'un objet de cette classe. Par conséquent, j'ai fini par faire toutes les fonctions statiques dans la classe. Y a-t-il quelque chose d'étrange à propos de cette conception. Devrais-je avoir ceci comme une interface à la place? Toute suggestion?


5 commentaires

En général, en C ++, on placerait des fonctions non membres à l'intérieur d'un espace de noms. Il n'y a pas besoin d'une classe à collecter des fonctions comme celle-ci.


Si vous n'avez qu'un seul parseur, un espace de noms ferait. Si vous avez Parser1 et Parser2 et que vous voulez pouvoir utiliser l'un ou l'autre, cette conception est une façon raisonnable de le faire.


Pourquoi pas deux espaces de noms différents dans ce cas?


Liée à Stackoverflow.com/questions/7345956/...


@ user592748 Vous ne pouvez pas transmettre un espace de noms comme argument de modèle.


4 Réponses :


6
votes

Une classe avec rien que des fonctions statiques semble assez indiscernable d'un espace de noms pour moi. Alors, pourquoi pas simplement utiliser un espace de noms?


4 commentaires

Je ne sais pas à quel point cela est vital, mais vous ne pouvez pas vous moquer d'un espace de noms (dans les cadres moqueurs que je connais).


Non, une classe sans membres de données peut avoir un constructeur.


Un constructeur n'est pas intéressant car ce n'est pas différent d'une autre fonction statique. Un destructeur pourrait être intéressant, mais un destructeur intéressant a probablement besoin d'au moins un membre de données booléen pour enregistrer si la classe a été déplacée (et par conséquent de savoir si le destructeur ne devrait pas faire toute chose intéressante aurait pu faire).


Non, car les fonctions statiques ne peuvent pas être déclarées en tant que membres des classes des parents, tandis que les classes de membres moins de données peuvent. Ainsi, le constructeur d'une classe moins membre dans une classe jointe sera appelé automatiquement. Cette fonctionnalité peut être atteinte par une fonction statique.



0
votes

Il est courant de faire des fonctions utilitaires statiques, de sorte que les fonctions de votre classe d'analyseur ne reposent pas les unes sur les autres, vous pouvez totalement les faire statique. S'ils s'appuient sur l'autre, et il peut être possible que les mêmes fonctions puissent être effectuées d'une autre manière, vous devez envisager d'utiliser une interface


0 commentaires

7
votes
  1. Vous voulez un analyseur et vous savez ce que vous voulez que ce soit pour vous - ceci est en vigueur, votre "interface".

  2. Votre Mise en œuvre actuelle de l'analyseur n'a pas besoin de variables de membre - par conséquent, pour mettre en œuvre votre interface, vous n'avez pas besoin d'une classe. Alors oui, éloignez-vous avec vos méthodes statiques. Comme Kevin dit, en utilisant un espace de noms avec des fonctions anciennes simples (non statique) est une bonne idée.

  3. Si vous estimez que vous devrez ajouter un nouvel analyseur devront maintenir l'état interne, vous souhaitez probablement définir une interface dans (1) - un ancien fichier d'en-tête visible publiquement visible avec des déclarations de fonction à l'intérieur d'une Espace de noms de votre choix suffit.


2 commentaires

Merci. Cela l'effache. Bravo pour clarifier la signification de l'interface et expliquer comment traiter le 2e cas.


Les méthodes statiques ne peuvent pas être appelées à partir du constructeur d'un objet parent automatiquement.



1
votes

La manière de décider de cette question est sur la manière dont les fonctions seront utilisées?

1) Si toutes les fonctions sont utilisées dans un fichier et n'ont pas besoin d'être exportées nulle part, utilisez définitivement des fonctions statiques. Pourquoi? Parce que vous pouvez simplement les saisir directement dans le corps de la classe dans le fichier .CPP et vous n'avez pas à vous soucier de maintenir les déclarations et de maintenir les paramètres alignés. Parce que lorsqu'une classe C ++ est analysée, tout le code à l'intérieur de chaque fonction définie à l'intérieur de l'organisme de classe est ignoré puis analysé une fois que tous les membres de classes ont été déclarés, les fonctions peuvent tous se voir les uns des autres et se retrouvent dans une meilleure situation de nom. Le compilateur Alline également beaucoup de fonctions plus petites si vous les déclarez directement dans la classe comme celle-là.

2) Si les fonctions doivent être utilisées à l'extérieur du fichier .CPP actuel, utilisez des fonctions normales. Parce que plus tard, ils peuvent être utilisés depuis n'importe où et les exporter par nom est plus facile.


0 commentaires