Par défaut, l'utilisation des espaces de fonctions.
Les Classes sont à construire des objets, de ne pas remplacer les espaces de noms.
Dans le code Orienté Objet
Scott Meyers écrit tout un Article pour son Effective C++ livre sur ce sujet, "Préférer la non-membre non-amis fonctions de fonctions de membre". J'ai trouvé un site de référence à ce principe dans un article de Herb Sutter: http://www.gotw.ca/gotw/084.htm
La chose importante à savoir, c'est que: Dans les fonctions C++ dans le même espace de noms que d'une classe appartiennent à la catégorie de l'interface. (parce que l'ADL sera à la recherche de ces fonctions lors de la résolution des appels de fonction)
des espaces de fonctions, à moins que déclaré "ami" n'ont pas accès à la classe des' internes, alors que les méthodes statiques ont.
Cela signifie, par exemple, lors de l'entretien de votre classe, si vous avez besoin de changer votre classe interne, vous aurez besoin de recherche pour des effets secondaires dans l'ensemble de ses méthodes, y compris la statique.
Extension Je
Ajout de code pour la classe de l'interface.
En C#, vous pouvez ajouter des méthodes à une classe, même si vous n'avez pas accès à elle. Mais en C++, c'est impossible.
Mais, toujours en C++, vous pouvez toujours ajouter un espace de noms de fonction, même à une classe quelqu'un a écrit pour vous.
Voir de l'autre côté, ce qui est important lors de la conception de votre code, car en mettant vos fonctions dans un espace de noms, vous autoriser vos utilisateurs afin d'augmenter ou de compléter la classe de l'interface.
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. Toutes les méthodes doivent être déclarées dans la même classe.
Pour les espaces de noms, des fonctions à partir du même espace de noms peut être déclaré en plusieurs en-têtes (la quasi-norme de la fonction d'échange est le meilleur exemple).
Extension III
La base cooless d'un espace de noms est que, dans certains code, vous pouvez éviter de le mentionner, si vous utilisez le mot-clé "aide":
#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 une bonne utilisation de la quasi-standard swap idiome.
Et c'est impossible à faire avec des méthodes statiques dans les classes.
Donc, C++ espaces ont leur propre sémantique.
Mais il va plus loin, comme vous pouvez le combiner des espaces de noms dans une manière similaire à l'héritage.
Par exemple, si vous disposez d'un espace de noms avec une fonction AAA, un espace de noms en B avec une fonction BBB, vous pouvez déclarer un espace de C, et apporter AAA et BBB dans cet espace de noms avec le mot-clé en utilisant.
Conclusion
Les espaces de noms sont pour les espaces de noms.
Les Classes sont des classes.
C++ a été conçu de sorte que chaque concept est différent, et est utilisé différemment, dans différents cas, comme une solution à des problèmes différents.
N'utilisez pas de classes lorsque vous avez besoin d'espaces de noms.
Et dans votre cas, vous avez besoin d'espaces de noms.