Verwenden Sie standardmäßig Namespace-Funktionen.
Klassen sollen Objekte erstellen und keine Namespaces ersetzen.
Im objektorientierten Code
Scott Meyers hat einen ganzen Artikel für sein effektives C ++ - Buch zu diesem Thema geschrieben: "Bevorzugen Sie Nicht-Mitglieder-Nicht-Freund-Funktionen gegenüber Mitgliedsfunktionen". Ich habe einen Online-Verweis auf dieses Prinzip in einem Artikel von Herb Sutter gefunden:http://www.gotw.ca/gotw/084.htm
Das Wichtigste ist: In C ++ gehören Funktionen im selben Namespace wie eine Klasse zur Schnittstelle dieser Klasse (da ADL diese Funktionen beim Auflösen von Funktionsaufrufen durchsucht).
Namespace-Funktionen haben, sofern sie nicht als "Freund" deklariert sind, keinen Zugriff auf die Interna der Klasse, während statische Methoden dies tun.
Dies bedeutet zum Beispiel, dass Sie bei der Pflege Ihrer Klasse, wenn Sie die Interna Ihrer Klasse ändern müssen, in allen Methoden, einschließlich der statischen, nach Nebenwirkungen suchen müssen.
Erweiterung I.
Hinzufügen von Code zu einer Klassenschnittstelle.
In C # können Sie einer Klasse Methoden hinzufügen, auch wenn Sie keinen Zugriff darauf haben. In C ++ ist dies jedoch unmöglich.
Aber immer noch in C ++ können Sie eine Namespace-Funktion hinzufügen, selbst zu einer Klasse, die jemand für Sie geschrieben hat.
Auf der anderen Seite ist dies beim Entwerfen Ihres Codes wichtig, da Sie Ihre Benutzer durch Platzieren Ihrer Funktionen in einem Namespace dazu berechtigen, die Benutzeroberfläche der Klasse zu erweitern / zu vervollständigen.
Erweiterung II
Als Nebeneffekt des vorherigen Punktes ist es unmöglich, statische Methoden in mehreren Headern zu deklarieren. Jede Methode muss in derselben Klasse deklariert sein.
Für Namespaces können Funktionen aus demselben Namespace in mehreren Headern deklariert werden (die fast standardmäßige Swap-Funktion ist das beste Beispiel dafür).
Erweiterung III
Die grundlegende Coolness eines Namespace besteht darin, dass Sie es in einigen Codes vermeiden können, ihn zu erwähnen, wenn Sie das Schlüsselwort "using" verwenden:
#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
Und Sie können die "Verschmutzung" sogar auf eine Klasse beschränken:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Dieses "Muster" ist für die ordnungsgemäße Verwendung der fast standardmäßigen Swap-Sprache obligatorisch.
Und dies ist mit statischen Methoden in Klassen unmöglich.
C ++ - Namespaces haben also ihre eigene Semantik.
Es geht aber noch weiter, da Sie Namespaces ähnlich wie bei der Vererbung kombinieren können.
Wenn Sie beispielsweise einen Namespace A mit einer Funktion AAA und einen Namespace B mit einer Funktion BBB haben, können Sie einen Namespace C deklarieren und AAA und BBB mit dem Schlüsselwort using in diesen Namespace bringen.
Fazit
Namespaces stehen für Namespaces. Klassen sind für Klassen.
C ++ wurde so konzipiert, dass jedes Konzept anders ist und in unterschiedlichen Fällen unterschiedlich verwendet wird, um unterschiedliche Probleme zu lösen.
Verwenden Sie keine Klassen, wenn Sie Namespaces benötigen.
Und in Ihrem Fall benötigen Sie Namespaces.