Per impostazione predefinita, utilizzare le funzioni basate sul nome.
Le classi devono costruire oggetti, non sostituire spazi dei nomi.
Nel codice orientato agli oggetti
Scott Meyers ha scritto un intero articolo per il suo efficace libro C ++ su questo argomento, "Preferire le funzioni non amiche dei non membri alle funzioni dei membri". Ho trovato un riferimento online a questo principio in un articolo di Herb Sutter:http://www.gotw.ca/gotw/084.htm
La cosa importante da sapere è che: In C ++ le funzioni nello stesso spazio dei nomi di una classe appartengono all'interfaccia di quella classe (poiché ADL cercherà quelle funzioni quando risolve le chiamate di funzione).
Le funzioni con spazio dei nomi, se non dichiarate "amiche", non hanno accesso agli interni della classe, mentre i metodi statici hanno.
Ciò significa, ad esempio, che quando si mantiene la propria classe, se è necessario modificare gli interni della propria classe, sarà necessario cercare gli effetti collaterali in tutti i suoi metodi, compresi quelli statici.
Estensione I
Aggiunta di codice a un'interfaccia di classe.
In C #, puoi aggiungere metodi a una classe anche se non hai accesso ad essa. Ma in C ++, questo è impossibile.
Ma, sempre in C ++, puoi ancora aggiungere una funzione con spaziatura dei nomi, anche a una classe che qualcuno ha scritto per te.
Vedi dall'altra parte, questo è importante quando progetti il tuo codice, perché inserendo le tue funzioni in uno spazio dei nomi, autorizzerai i tuoi utenti ad aumentare / completare l'interfaccia della classe.
Estensione II
Un effetto collaterale del punto precedente, è impossibile dichiarare metodi statici in più intestazioni. Ogni metodo deve essere dichiarato nella stessa classe.
Per gli spazi dei nomi, le funzioni dello stesso spazio dei nomi possono essere dichiarate in più intestazioni (la funzione di scambio quasi standard è il miglior esempio).
Estensione III
Il cool di base di uno spazio dei nomi è che in alcuni codici, puoi evitare di menzionarlo, se usi la parola chiave "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
E puoi persino limitare l '"inquinamento" a una classe:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Questo "modello" è obbligatorio per l'uso corretto del linguaggio di scambio quasi standard.
E questo è impossibile da fare con i metodi statici nelle classi.
Quindi, gli spazi dei nomi C ++ hanno la loro semantica.
Ma va oltre, poiché puoi combinare gli spazi dei nomi in un modo simile all'eredità.
Ad esempio, se si dispone di uno spazio dei nomi A con una funzione AAA, uno spazio dei nomi B con una funzione BBB, è possibile dichiarare uno spazio dei nomi C e portare AAA e BBB in questo spazio dei nomi con la parola chiave utilizzando.
Conclusione
Gli spazi dei nomi sono per gli spazi dei nomi. Le lezioni sono per lezioni.
Il C ++ è stato progettato in modo che ogni concetto sia diverso e viene utilizzato in modo diverso, in casi diversi, come soluzione a problemi diversi.
Non usare le classi quando hai bisogno di spazi dei nomi.
E nel tuo caso, hai bisogno di spazi dei nomi.