Par défaut, utilisez les fonctions d'espaces de noms.
Les classes doivent créer des objets et non remplacer des espaces de noms.
En code orienté objet
Scott Meyers a écrit un article entier pour son livre Effective C ++ sur ce sujet, "Préférez les fonctions non-membres non-amis aux fonctions membres". J'ai trouvé une référence en ligne à ce principe dans un article de Herb Sutter:http://www.gotw.ca/gotw/084.htm
La chose importante à savoir est la suivante: En C ++, les fonctions du même espace de noms qu'une classe appartiennent à l'interface de cette classe (car ADL recherchera ces fonctions lors de la résolution des appels de fonction).
Les fonctions à espace de nom, sauf si elles sont déclarées «ami», n'ont pas accès aux internes de la classe, contrairement aux méthodes statiques.
Cela signifie, par exemple, que lors de la maintenance de votre classe, si vous devez modifier les internes de votre classe, vous devrez rechercher des effets secondaires dans toutes ses méthodes, y compris les effets statiques.
Extension I
Ajout de code à l'interface d'une classe.
En C #, vous pouvez ajouter des méthodes à une classe même si vous n'y avez pas accès. Mais en C ++, c'est impossible.
Mais, toujours en C ++, vous pouvez toujours ajouter une fonction d'espacement de noms, même à une classe que quelqu'un a écrite pour vous.
Voyez de l'autre côté, cela est important lors de la conception de votre code, car en plaçant vos fonctions dans un espace de noms, vous autoriserez vos utilisateurs à augmenter / compléter l'interface de la classe.
Extension II
Un effet secondaire du point précédent, il est impossible de déclarer des méthodes statiques dans plusieurs en-têtes. Chaque méthode doit être déclarée dans la même classe.
Pour les espaces de noms, les fonctions du même espace de noms peuvent être déclarées dans plusieurs en-têtes (la fonction d'échange presque standard en est le meilleur exemple).
Extension III
La fraîcheur de base d'un espace de noms est que dans certains codes, vous pouvez éviter de le mentionner, si vous utilisez le mot-clé "using":
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Et vous pouvez même limiter la "pollution" à une seule classe:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Ce «modèle» est obligatoire pour la bonne utilisation de l'idiome d'échange presque standard.
Et cela est impossible à faire avec des méthodes statiques dans les classes.
Ainsi, les espaces de noms C ++ ont leur propre sémantique.
Mais cela va plus loin, car vous pouvez combiner des espaces de noms d'une manière similaire à l'héritage.
Par exemple, si vous avez un espace de noms A avec une fonction AAA, un espace de noms B avec une fonction BBB, vous pouvez déclarer un espace de noms C et amener AAA et BBB dans cet espace de noms avec le mot-clé using.
Conclusion
Les espaces de noms sont pour les espaces de noms. Les cours sont pour les cours.
C ++ a été conçu pour que chaque concept soit différent et soit utilisé différemment, dans différents cas, comme solution à différents problèmes.
N'utilisez pas de classes lorsque vous avez besoin d'espaces de noms.
Et dans votre cas, vous avez besoin d'espaces de noms.